1.什么是事务:
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
例如:A——B转帐,对应于如下两条sql语句
update from account set money=money+100 where name='B';
update from account set money=money-100 where name='A';
2.事务ACID四大特性:
A 原子性(Atomicity)
一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性
C 一致性(consistency)
一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
I 隔离性(isolation)
事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。
D 持久性(durability)
一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。
3.事务的隔离级别
MySQL数据库共定义了四种隔离级别:
- Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。
- Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。
- Read committed(读已提交):可避免脏读情况发生。
- Read uncommitted(读未提交):最低级别,以上情况均无法保证。
4.脏读、可重复读、虚读(幻读)概念:
1、脏读:脏读指一个事务读取了另外一个事务未提交的数据。
指一个事务A正在访问数据,并且对该数据进行了修改,但是这种修改还没有提交到数据库中(也可能因为某些原因Rollback了)。这时候另外一个事务B也访问这个数据,然后使用了这个被A修改的数据,那么这个数据就是脏的,并不是数据库中真实的数据。这就被称作脏读。
解决办法:把数据库事务隔离级别调整到READ_COMMITTED
即让用户在更新时锁定数据库,阻止其他用户读取,直到更新全部完成才让你读取。
2、不可重复读:不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。
不可重复读:指在一个事务A内,多次读同一个数据,但是事务A没有结束时,另外一个事务B也访问该同一数据。那么在事务A的两次读数据之间,由于事务B的修改导致事务A两次读到的数据可能是不一样的。这就发生了在一个事务内两次读到的数据不一样,这就被称作不可重复读。
解决办法:把数据库事务隔离级别调整到REPEATABLE_READ
3、虚读(幻读):虚读(幻读)是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
幻读:指一个事务A对一个表中的数据进行了修改,而且该修改涉及到表中所有的数据行;同时另一个事务B也在修改表中的数据,该修改是向表中插入一行新数据。那么经过这一番操作之后,操作事务A的用户就会发现表中还有没修改的数据行,就像发生了幻觉一样。这就被称作幻读。
解决办法:把数据库事务隔离级别调整到SERIALIZABLE_READ
注:级别高低:脏读 < 不可重复读 < 幻读
所以设置了最高级别的SERIALIZABLE_READ就不需要设置其他的了,即解决了幻读问题那么脏度和不可重复读自然就都解决了。