SQL标准中对事务的四个隔离级别
数据库中多个事务并发可能会产生脏写、脏读、不可重复读、幻读这几种问题。针对这些多事务并发的问题,实际上SQL标准中规定了事务的几种隔离级别,用来解决这些问题。
在SQL标准中规定了4种事务隔离级别,就是说多个事务并发运行的时候,相互是如何隔离的,从而避免一些事务并发的问题。
- read uncommited(读未提交)
- read commit(读已提交)
- repeatable read(可重复读)
- serializable(串行化)
读未提交
第一个read uncommitted隔离级别,是不允许发生脏写的。
也就是说,不可能两个事务在没提交的情况下去更新同一行数据,但是这种隔离级别下,可能发送脏读、不可重复读、幻读
因此,实际开发中这个级别基本不用
读已提交
第二个是read committed隔离级别,也叫做RC。这个级别下,不会发生脏读和脏写,
也就是说,别的事务没提交的情况下,你是绝对读不到的。但是可能会发生不可重复读和幻读问题,因为一旦别的事务修改了值然后提交了,你事务是会读到的,所以可能你多次读到的值是不同的
可重复读
第三个是REPEATABLE READ隔离级别,就是可重复读级别,也叫做RR
这个级别下,不会发生脏写、脏读和不可重复读。因为一个事务多次查询一个数据的值,哪怕别的事务修改了这个值还提交了,没用,你不会读到人家提交事务修改过的值,事务一旦开始,多次查询一个值,会一直读到同一个值。
举个例子:
- 一个事务A,第一次查询一行数据的值是A
- 接着事务B修改了这行数据的值为B,还提交了
- 接着事务A再次查询这行数据的值,读到的还是值A。
但是会发生幻读
因为假设你一次SQL是根据条件查询,比如“select * from table where id > 10”,第一次查出来10条数据,结果另外一个事务插入了一条数据,下次你可能会查出来11条数据,还是会有幻读问题的。
RR级别,只不过保证对同一行数据的多次查询,你不会读到不一样的值,人家已提交事务修改了这行数据的值,对你没有影响。
串行级别
这种级别,根本就不允许你多个事务并发执行,只能串行起来执行,先执行事务A提交,然后执行事务B提交,接着执行事务C提交,所以此时你根本不可能有幻读的问题,因为事务压根儿都不并发执行!
实际上基本不用,因为单个事务串行,那数据库性能就会很差
小结
最常用的是RC和RR级别,其他两种基本不用