事务一共有4种隔离级别:未提交读,已提交读,可重复读,可序列化
1)未提交读RU
未提交读是最低的级别,会产生幻读,脏读,不可重复读,理论上来说只要是没被损坏的数据都会读到;一个事务在运行时能访问其他事务未提交的数据;事务在运行写操作的时候,是不允许其他事务进行写的操作;但是运行其他事务进行读该数据的操作;
举个例子(针对幻读,该种级别出现的脏读,不可重复读,后面两条会有例子):
A事务查询B事务,查询的条数是1;这事B事务插入了一条,A事务继续查询B事务,得到的是2条;
这种隔离级别是可以防止更新丢失
2)已提交读RC
已提交读,属于语句级,一个事务在执行过程中读不到其他食物未提交的数据,但是可以读到已提交的数据,读取数据的事务允许其他事务继续读取该数据;
举个例子(针对):A事务开始时,查询B事务的某一条数据,得到结果为1,B事务这事提交了数据,将结果更改为2,A事务这事再查询B事务这条数据,返回结果为2
此隔离级别可有效防止脏读,但会出现不可重复读,幻读
3)可重复读
可重复读数据事务级别;一个事务可以访问其他食物新增的数据,但是不可访问其他事务修改的数据,读取数据的事务将会禁止写事务,写事务则禁止任何其他事务
举个例子:A事务开始时,查询B事务某一条数据,得到结果是1,B事务修改结果为2,这时A继续查询B,是不允许访问B修改后的数据;因此得到结果还是1;避免的不可重复读
此隔离级别可有效防止不可重复读和脏读,但还是会出现幻读
4)可序列化
严格要求事务一个一个的执行,不允许并发执行;这种可以避免脏读,幻读,不可重复读;但是该事务级别有瑕疵,可能导致其他事务等待,甚至超时;实际开发过程,至少我是没有这样做过
总结:事务的隔离级别选用的一般是已提交读;针对已提交读出现的不可重复读问题,一般使用的是乐观锁,使用version来;数据库默认的隔离级别是可重复读