事务就是把多条SQL包装成一个整体,里面的SQL语句要么全部都执行,要么全部不执行。其实事务里面的SQL也不是完全不执行,而是利用了事务的回滚(rollback)机制,当SQL执行到哪条语句出错了,就会触发回滚机制,进行数据的还原操作。

MySQL中事务有四个特性:1.原子性 2.持久性 3.一致性 4.隔离性。接下来我们来对这四个特性进行解释。

1.原子性:

上面讲到的事务就是多条SQL包装成一个整体,要么全部执行,要么全部不执行,这就是原子性造成的,原子性从字面上理解就是把事务看成一个原子,不可以在进行分离,事务本身就是一个整体,要么这个事务完成操作,要么事务不完成操作。原子性可以防止一些特性特殊状况,防止数据因某种特殊原因而出现偏差。原子性也是事务的核心。

2.持久性:

因为我们把MySQL数据库中的数据存储在硬盘中,当发生一些特殊情况,例如:主机掉电,停电的突发状况,可以保证数据不会丢失且数据库的修改都是永久化的。

3.一致性:

一个事务的执行前后数据库的数据都是一个合理合法的状态,例如:银行转账的时候,不能够出现负数的状态。

4.隔离性:

隔离性描述的是事务在并发执行的时候,产生的状况。

我们这个举一个例子来方便理解:

比如一个同学有一个看到老师在写代码备课,这位同学因为想提前预习,所以把老师的代码记录了下来。在上课的时候突然发现,老师的代码跟自己记录的代码在某个数据上出现了偏差,之后你去询问老师,老师告诉同学,他修改了这个数据。这种情况就是同学读到了”脏“数据,也是所谓的脏读。然后这位老师跟这位同学做了约定,我没提交到GitHub的代码,不要去读,这里就对写进行了加锁。这就可以解决脏读问题。但是之后这位同学在浏览GitHub的代码的时候,突然发现,数据在变化,因为老师正在修改代码,这时候,这种现在就是不可重复读问题。为了解决这个问题,同学跟老师又进行了一个约定,在同学读代码的时候,老师不能进行修改。这就解决了不可重复度,对读进行加锁。但是同学在浏览代码的时候,老师总不能摸鱼吧,老师就去写另一个代码B,当同学在读代码A的时候,老师提交了代码B,同学发现GitHub上多了一个新的代码,这就是幻读问题,这时候这位同学对老师再进行了一个约定,在这位同学进行浏览代码的时候,老师就去摸鱼,对整个过程进行了串行化操作。

通过上面的例子我们知道了事务的四种隔离级别:

1.read uncommitted:允许读未提交的数据,但是会引入脏读、不可重复度、幻读的问题,并发的程度最高,隔离的程度最低。

2.read committed:只允许读提交了的数据,只对写进行了加锁操作,这样解决了脏读问题,但是没有解决不可重复度和幻读,隔离的程度提高了一些,并发程度降低了一些。

3.repeatable read:对读写进行了加锁操作,并发的程度又在上一个隔离级别的基础上降低了一些,隔离性增加,解决了脏读、不可重复度,但是没有解决幻读现象。

4.serializable:对整个过程串行化,并发程度最低,隔离级别最高,解决了脏读、不可重复读、幻读的问题,但是执行速度最慢。