脏读
数据库脏读是指当一个事务正在访问数据,并且对数据进行了修改/插入,而这种修改/插入你还没有commit到数据库中,这时,另外一个事务也访问这个数据,然后前一个事务因为一些原因(比如后面操作没有执行成功)rollback回滚了事务,导致事务2读取到了无效数据。
不可重复读
不可重复读指的是,一个事务1,多次读取同一数据,但是中间有事务2对数据进行了修改,导致是事务1前后读取到的数据不一样。
幻读/幻影读
幻读指的是,一个事务1对查询的的结果集进行修改操作,事务2又插入了一行满足该条件的数据,导致事务1没有修改到事务2插入的这一行。
解决办法:
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。
数据库隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
mysql查看数据库事务隔离级别
1 | show variables like '%isolation%'; |
修改mysql数据库事务隔离级别
设置innodb的事务级别方法是:set 作用域 transaction isolation level 事务隔离级别,例如:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}1
2
3mysql> set global transaction isolation level read committed; #全局的
mysql> set session transaction isolation level read committed; #当前会话