1.read uncommited
别人没commit的操作也能查到
2.read commited
别人commit了的操作才能查到
但是在同一个事务里面如果两次查询的中间数据被其他人修改则查到的结果不一样
例,场景1:
BEGIN WORK
查询1:select b from test_table where a=1;
#返回b=1
#此时如果另一个人修改了b的值如:update test_table set b=2 where a=1;
#下面同样的查询在返回的结果不再是1,而是修改后的值:2
查询2:select b from test_table where a=1;
#返回b=2
END WORK
3.repeatable read
这种级别可以保证“场景1”.查询2的结果和查询1一样
但是在下面场景,会出现幻读:
例,场景2:
BEGIN WORK
查询1:select b from test_table where a>1;
#返回
rec1:b=2
rec2:b=3
#此时如果另一个人修改了b的值如:insert into test_table (a,b) values(4,4);
查询2:select b from test_table where a>1;
#返回
rec1:b=2
rec2:b=3
rec3:b=4END WORK
可见 repeatable read隔离级别只能 锁定指定记录,同一事务中读取过的记录,多次读取结果一致但是不能锁定一个范围内的数据不发生变化
4.Serializable
最高级别,锁定记录范围,同一事务中,查询同一范围的数据不会有变化