事务ACID特性:
1.Atomicty(原子性)
2.Consistency(一致性)
3.IsoIation(隔离性)
4.Durability(持久性)
原子性:对数据的修改要么全部执行成功,要么全部失败。
一致性:如果A账户给B账户赚钱,不可能A扣钱,B没有价钱。
隔离性:不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
持久性:事务一旦提交,数据库中的数据必须被永久保存下来,即使服务器崩溃还是断电,只要数据库重启数据就会恢复到事务成功结束后的状态。
脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。(可以理解不是正确的数据)
不可重复读:
幻读:
不可重复读和幻都是读取另一条已提交的事务,不可重复读的重点是update和delete,而幻读是insert。
在可重复读中:该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,
所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,
不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,
但会极大的降低数据库的并发能力。
现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
查看当前事务的隔离级别:
将事务的隔离级别设置为Read uncommitted级别:
记住:设置数据库的隔离级别一定要是在开启事务之前!