MySQL中的事务

1.事务的特性

  1. 原子性(Atomicity)。事务中所涉及的程序对数据库的修改操作要么全部成功,要么全部失败。
  2. 一致性(Consistency)。事务执行前和执行后来源和去向保持平衡。
  3. 隔离性(Isolation)。并发时每个事务是隔离的,相互不影响。
  4. 持久性(Durubility)。一旦事务成功提交,应该保证数据的完整存在。

2.原子性

MySQL中的事务
如图,当我们开起一个事务时,再添加一系列的操作,而这些操作被一个事务所包裹着,成为一个整体,不可在进行分割,如果在执行时一个操作出现异常则整体连坐都会失败,否则是全部都执行成功,所以说原子性,要么都成功,要么都失败。

3.一致性

MySQL中的事务

一致性我们通常可以通过转账来理解,如上图所示,就是A扣100,B加100的操作,如果在A当扣完100后突然出现了异常导致没有执行B加100的操作时,根据原子性会执行回滚操作,A之前执行的操作也就失效了,从而保证了A与B的账户余额还是转账之前的数值。

4.隔离性

隔离性主要体现在多个事务对同数据进行操作时,为了保证事务之间的安全而存在的。面对多事务操作时也会存在一些不同的问题,如脏读,不可重复读,幻读,说到这里不得不说一下事务的隔离级别,如下:
MySQL中的事务

*读未提交(READ_UNCOMMITTED)

MySQL中的事务

如上图所示,事务A将原有的数值50改为了30,但是事务A还没有提交,这时候事务B就去读取数据读取到了30,如果这时事务A对数据进行了回滚操作,事务B就读到的30就是不存在的数据,这就出现了脏读。

*读以提交(READ_COMMITTED)

MySQL中的事务
如上图所示,事务A将原有的数值50改为了30,但是事务A还没有提交,这时候事务B就去读取数据读由于是读已提交所以事务B只能读取50,如果这时事务A进行提交,事务B再去读数据发现数据变成了30,这就出现了不可重复读。

*可重复读(REPEATABLE_READ)

MySQL中的事务
如图,假设事务第一次去读数据时发现没有数据并返回,这时事务A就将50添加到其中,这时事务B再次去读取数据发现又有数据了,这就出现了幻读。

*串行化(SERIALIZABLE)

串行化就是事务A与事务B一个一个去操作数据类似于加了锁,不能同操作,这样效率就会很低。

5.持久性

一旦事务成功提交,应该保证数据的完整存在。