事务的隔离级别
1.如果不考虑隔离性,引发一些安全问题:
如果不考虑隔离性(一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上:
脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致。(同一个数据库表开启两个事务,其中一个事务A操作了表的数据,但是并未提交,这时另外一个事务B查询当前表的数据,查询到的数据是已经修改的数据,但是当A将事务回滚以后,B查询到的数据又是事务A修改之前的数据)。
不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致。(同一个数据库表开启两个事务,其中一个事务A操作了表的数据,但是并未提交,这时另外一个事务B查询当前表的数据,查询到的数据还是未修改的数据,但是当A将数据提交后,B能查询到的数据还是A事务修改之前的数据,只有在B事务提交结束之后,重新打开查询才能查询到A事务修改后的数据!)。
虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。
2.解决这些安全性问题:
设置事务的隔离级别:
read uncommitted:脏读,不可重复读,虚读都有可能发生
read committed:避免脏读。但是不可重复读和虚读是有可能发生
repeatable read:避免脏读和不可重复读,但是虚读有可能发生。
serializable:避免脏读,不可重复读,虚读。
3.事务隔离级别的设置:
设置事务的隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别
查看当前的隔离级别:
SELECT @@tx_isolation;