ACID分别是 原子性
(Atomicity)、一致性
(Consistency)、隔离性
(Isolation)、持久性
(Durability)
概念的东西就不在赘述了,最近遇到一个关于事务隔离性的问题。
简单回顾一下关于事务隔离特性的几个级别
read uncommitted(读未提交) 、read committed(读提交) 、repeatable read(重复读) 、Serializable(序列化)
查看当前数据库事务隔离级别 select @@transaction_isolation;
参考文献:MySQL :: MySQL 8.0 Reference Manual :: 13.3.7 SET TRANSACTION Statement
简单讨论一下几个关于隔离特性的几个问题
问题1 可重复读指的是什么?
在同一个事务中同一条查询语句返回的结果是相同的。不受其他事务影响。
问题2 在同一个事务中如果amount发生了update或insert操作,事务在未提交前查询返回的结果是否是更新后或插入后的结果?为什么?
答案:会 读取到后更新或插入后的结果。这是因为select 读取数据有个两种模式,如果不加锁的模式为快照读 ,如果添加锁(lock in share mode,for update)为当前读。
问题3 事务中快照读和当前读分别怎样解决重复读级别下幻读问题的?
mvcc和next-key锁
问题4 两个事务中都没有提交情况下,每个事务中分别执行insert语句 执行顺序对最后表中结果有什么影响?为什么?
表会按照执行insert顺序记录。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X)
看到这里你可能还是不太明白,如果你读完下一篇MYSQL锁的文章你自然就明白了。