【数据一致性】1:什么是事务

本文基于Mysql数据库

事务(Transaction)是什么

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。–维基百科

以上是维基百科做出的解释,用我们平时的操作来说,事务就是由各种操作组合而成的具有某些特性的组合操作。那么,某些特性指的是什么呢。

事务的四个特性(ACID)

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

让我们举一个转账的例子来说明这四个特性;小明账户里有100元,小红账户里有100元,这个时候小明往小红账户里转100元。这个时候包含两个操作:

  • A.先再小明账户里减100元
  • B.然后再往小红账户里加100元

这两个操作组合起来,就成为了一个事务。然后让我们来看看其中应该包含的四个特性:

  • 原子性(Atomicity):操作 A 和 B 要么全部执行,要么全部不执行。否则如果 A 操作执行成功,但是 B 操作执行失败,就算造成虽然小明的账户加了100元,但是小红的账户里并没有加钱。
  • 一致性(Consistency):一致性比较特殊,需要特殊的做出说明,ACID中的 AID都是数据库本身的实现,只有一致性是不属于数据库本身实现而是依赖于应用层也就是开发者的,那么对于转账而言一致性就是指转账之前钱的总数是200元,那么转账之后钱的总数也要是200元。这就是从一个一致状态转变为另一个一致状态。
  • 隔离性(Isolation):如果在小明给小红转账的这个事务处于正在进行并且未提交的状态中,此时小明查询自己的余额是会查询到0还是100?事务的隔离性不唯一,可以有很多种选择,但是我们一般都会选择将事务之间相互隔离并且独立。
  • 持久性(Durability):持久性是指如果事务成功提交,那么我们对数据库的修改应该是永久性的保存在数据库中而不随着数据库的重启,崩溃,断电而丢失。

脏读、幻读、重复读

上面我们讲到了事务的四大特性,其中隔离性尤为复杂,事务的并发与串行之间的执行效果应该相等。那这就要求两点:

  • 事务执行过程的中间状态不能也不应该暴露给其它的所有事务(数据库使用隔离性来实现这一点)。
  • 并发的事务之间不能操纵同一个数据(数据库使用锁来实现这一点)。

下面我们来看看可能会因隔离性而产生的问题:

脏读:指一个事务处理过程里读取了另一个事务未回滚之前的脏数

《【数据一致性】1:什么是事务》

重复读:事务 A 中读取一条数据A1的值为1,在事务 A 还没提交之前,事务 B 修改了A1的值为2,这个时候事务 A 再次读取A1,发现值发生了改变,这就是重复读。

《【数据一致性】1:什么是事务》

幻读:幻读主要在于数据数量的变化,事务 A 中读取条件为 A1的记录数量有3条,在事务 A 还没提交之前,事务 B 插入了1条满足 A1条件的记录,这个时候事务 A 再次按照条件A1读取,发现居然有4条记录,这就是幻读。

《【数据一致性】1:什么是事务》

数据库的四种隔离级别

为了避免脏读、幻读、重复读等以上问题,数据库设置了四个隔离级别,从低到高依次为:

  1. READ_UNCOMMITTED(读未提交):这是事务的最低隔离级别,如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其它事务读取此行数据。在这种级别下,脏读、幻读、重复读都有可能发生。
  2. READ_COMMITTED(读已提交):在此隔离级别中,一个读取数据的事务允许其它事务并行读取该行数据,但是未提交的写事务将会禁止其它事务并行读取该行数据。这个级别保证了一个事务已经提交之后才能被另外一个事务读取到。可以避免脏读的发生。
  3. REPEATABLE_READ(可重复读,数据库默认级别):一个读取数据的事务中允许其它的读事务但是禁止写事务,写事务则禁止其余任何事务。可避免脏读、重复读的发生,但是无法避免幻读。
  4. SERIALIZABLE(可串行化):使得每个事务串行化,不存在并发,也是四个级别里使用代价最高的,隔离级别也是最高的,它会在每个读的数据上加上共享锁,可能导致大量的超时现象和锁竞争。脏读、幻读、重复读都可以避免。

本文首发自微信订阅号:代码有杀气,欢迎大家一起交流 JAVA WEB 前后端技术。

【数据一致性】1:什么是事务

    原文作者:MySql
    原文地址: https://juejin.im/entry/5bea29cb51882579117f5afc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞