这里先简单罗列一下四大特性

1、原子性:是指一个方法里的操作要同时成功或者同时失败。
2、一致性:事务前后数据的完整性必须保持一致。
3、隔离性:要保证数据之间不能相互影响,有四种隔离等级。
4、持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

原子性和一致性的区别

一致性:简单打个比方,比如两个账户之间的转账,转账前为A状态,转账后为B状态。A状态下两个账户加起来有100元,转账之后到B状态,两个账户加起来应该还是100元,这叫一致性。如果一个账户扣了钱,而另一个账户没有加钱,两个账户加起来就小于100元了,此时就破坏了数据的一致性。

而原子性强调的是,同时成功或同时失败,比如上述的扣钱操作和另一个账户的加钱操作要保证原子性,要么同时成功,要么同时失败。原子性是保证数据一致性的一种手段,但并不是唯一的手段。再并发情况下,即使能保证原子性,也不一定能保证数据的一致性。

四大隔离等级

假设现在有A、B两个事务正在操作同一个库的同一个表中的数据。

1读未提交read uncommitted 相当于两个事务完全掺杂在了一起,A一改变不用提交,B立马知道。这种级别会有脏读问题,当然就更有不可重复读,幻读问题。

2读已提交read committed 相当于两个事务有掺杂,A提交以后,B才知道A的变化。A一改变并提交在B的事务中就知道了。解决了脏读,但会有不可重复读问题,当然更有幻读问题。

3可重复读repeatable read 相当于两个事务有掺杂,A提交以后,B不知道A的变化。即在B事务中不知道,只有B的当前事务结束了,再开启另一个事务才知道A的变化,这就解决了不可重复读问题。

但是在事务中如果A事务通过增删方式改变,B事务中是知道的,因为不涉及同一个数据,所以不影响安全,所以允许这种现象发生,这就是幻读问题。

4串行化serializable 相当于两个事务完全隔离,AB两个事务不能同时执行,只能排队执行。不会产生任何数据安全问题。

隔离等级由1到4,逐渐提高,但性能也会降低,特别是最高等级时相当于加了同步锁,效率极低。其中可重复读隔离性已经很高了,但不能解决并发问题,并发时有可能导致破坏一致性,串行化是最高隔离级别,可以解决并发问题,但效率很低,一般不采用。解决并发问题可以用乐观锁机制,效率高,不阻塞。

考虑到执行效率,MySQL数据库采用可重复读repeatable read这个等级。这个等级的隔离级别已经很高了,解决了脏读,不可重复读问题,但是会有幻读问题。不过,MySQL在这个级别中做了处理,解决了幻读的问题。