事务的隔离级别
事务的四大特性
事务的四大特性分别是:原子性、一致性、隔离性、持久性。
幻读和不可重复读都是同一个事务中多次读取了其他事务已经提交的事务的数据导致每次读取的数据不一致,所不同的是不可重复读读取的是同一条数据,而幻读针对的是一批数据整体的统计(比如数据的个数)。
事务的隔离级别
Read uncommitted(读未提交)
一、第一种隔离级别
Read uncommitted(读未提交):
如果一个事务已经开始写数据,则另一个事务则不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“”非他写锁“,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读。也就是说事务B读取到了事务A未提交的数据。
解决了更新丢失和脏读问题。
Read committed(读提交)
二、第二种隔离级别
Read committed(读提交):
如果一个读事务(线程),则允许其它事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是却可能出现不可重复读。事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取数据时,数据已经发生了改变。
解决了更新丢失和脏读问题
Repeatable read(可重复读取)
三、第三种隔离级别
Repeatable read:
可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,其它事务不能访问该数据(包括了读写),这样就可以在一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其它事务(包括读写)。这样避免了不可重复读取和脏读,但是有时可能出现幻读。(读取数据的事务)这可以通过“共享读锁”和“排他写锁”实现。
解决了更新丢失、脏读、不可重复读,但是还会出现幻读。
Serializable(可序列化)
四、第四种隔离级别
Serializable:
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个的执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。序列化是最高的事务隔离级别,同事代价也花费最高,性能低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻象读。
解决了更新丢失、脏读、不可重复读、幻读(虚读)
总结:以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似JAVA中多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况,在MySQL数据库中默认的隔离级别为Repeatable read(可重复读)。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeated read(可重复读)。
而在Oracle数据库中,只支持Serializable(串行化)级别和Read committed(读已提交)这两种级别,其中默认的为Read committed级别。