数据库隔离级别

数据库隔离级别

脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

Read Uncommitted

读未提交,脏读

事物B开始——B修改数据(1000->2000)——B发现不对,回滚——B修改数据1000->1500——B提交

​ 事物A开始——A读到数据2000——结束 A再读发现不是2000

Read committed Oracle Sql Server

避免脏读但是不能避免不可重复读

指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

事物B开始——B访问数据得到2000————B休息了一会————B又访问发现不是2000——事物B提交错误

​ 事物A开始——事物A转走了2000——事物A提交

Repeatable read MySQL

避免不可重复读,但是会出现幻读

在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免

事物A读 ——事物查询全部——事物A等了一会儿——事物A又查询,发现多了一条

​ 事物B插入

Serializable

最高级别