当事务发生并发时处理的一些级别:
1. 读未提交 (READ-UNCOMMITTED)最低级别,任何情况都无法保证
当客户端A开启事务更改数据,就算没有提交事务,其他客户端查询到的也是A更改后的数据。当客户端A进行ROLLBACK时,其他客户端查看的则是没有更改的数据。
这种级别会产生脏读的情况,因为其他客户端查看的数据都是跟着A走的,随时会变。
2. 读已提交 (READ-COMMITTED)可避免脏读的发生。
当客户端A开启事务更改数据,只要A不COMMIT。则无论A怎么更改,其他客户端看到的都是原来的数据,只有A提交了,其他客户端才会看到更改后的数据。
避免了READ-UNCOMMITTED的脏读情况,但是又会造成不可重复读的情况,假如其他客户端查询了A正在事务中的数据并且用查到的数据又进行了其他操作,
A又提交了事务,就会造成其他客户端拿到的数据不对,数据已经改变了。
3. 可重复读(REPEATABLE-READ)可避免脏读、不可重复读的发生。 (如果不做设置的话,MySQL默认为当前级别)
当客户端A与客户端B同时开启事务,A在事务里面做的添加或修改在B里面是看不到的,B看到的只有原本的数据,只有当A提交了并且B也结束了他的事务,才能看到A操作后的数据。
A和B互不干扰,解决了脏读、不可重复读的问题。但会出现幻读的情况,在客户端B里面看就是莫名其妙的更改了或新增了A操作的数据。
4. 串行化(SERIALIZABLE)可避免脏读、不可重复读、幻读的发生。
当客户端A与客户端B一起开启事务,A对数据进行更新SQL语句会被锁住(卡住不动,不返回操作结果),当B结束事务的时候 A的SQL语句才会执行。
SERIALIZABLE可解决以上三种隔离级别存在的问题,但是对并发的性能会变差,同时安全性会变高。
相关命令:
-- 查看数据库当前的隔离级别
select @@tx_isolation;
-- 设置数据库的隔离级别
set tx_isolation = ‘要设置的隔离级别‘ 或 SET SESSION tx_isolation = ‘要设置的隔离级别‘;