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