数据并发问题:
脏写:
如果事务 A 修改了 另一个 未提交 事务 B 修改过 的数据,那就意味着发生了 脏写
脏读:
对于两个事务 A、B,A 读取 了已经被 B 更新 但还 没有被提交 的字段。
之后若 B 回滚 ,A 读取 的内容就是 临时且无效 的。
不可重复读:
对于两个事务A、B,A 读取 了一个字段,然后 B 更新 了该字段。 A 再次读取 同一个字段, 值就不同 了。
幻读:
对于两个事务 A、B, A 从一个表中 读取 了一个字段, 然后 B 在该表中 插 入 了一些新的行。
如果 A 再次读取 同一个表 , 就会多出几行。那就意味着发生了幻读。
隔离级别:
READ UNCOMMITTED :
所有事务都可以看到其他未提交事务的执行结 果。不能避免脏读、不可重复读、幻读。
READ COMMITTED :
一个事务只能看见已经提交事务所做 的改变。 可以避免脏读,但不可 重复读、幻读问题仍然存在。
REPEATABLE READ :
事务A在读到一条数据之后,此时事务B对该数据进行了修改并提 交。
那么事务 A 再读该数据,读到的还是原来的内容。
可以避免脏读、不可重复读,但幻读问题仍 然存在。这是 MySQL 的默认隔离级别。
注: 对于SQL标准来讲,该隔离级别无法解决幻读问题
但对于MySQL来讲,该隔离级别可以解决幻读问题
SERIALIZABLE :
确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。 所有的并发问题都可以避免,但性能十分低下。
注: 所有的隔离级别都不允许脏写的情况发生
相关命令:
查看 MySQL当前的隔离级别:
5.7.20 以前: show variables like ' tx_isolation ' ;
5.7.20 以后: show variables like ' transaction_isolation ' ;
设置事务的隔离级别:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;
#其中,隔离级别格式:
> READ UNCOMMITTED
> READ COMMITTED
> REPEATABLE READ
> SERIALIZABLE