两种事务读现象:
幻读和不可重复读的区别,总结就是"不可重复读"指的是同一行的两次读, "换读"是第二次读获取到了新的行.
mvcc可以.不出现幻读. 详见如上文章中的源代码阅读. 数据库的解决方法和思路同样能用于"互联网开发". 例如版本号的概念. 创建版本号,删除版本号. 实体生命周期对应的版本号.
(select from ) - mvcc在可重复读隔离级别下可以避免幻读,被称为快照读
这篇文章的例子倒是不错,能很好的解释为什么mvcc解决了幻读, 注意这篇文章例子不错,但是结论错了.https://www.jianshu.com/p/cef49aeff36b
不过mvcc无法解决业务上的并发问题
(select for update 悲观锁, update where 乐观锁) -- 两种实现 可以实现同一行的并发问题.
在MySQL的InnoDB中,预设的Tansaction isolation level 为REPEATABLE READ(可重读)
在SELECT 的读取锁定主要分为两种方式:
SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE
这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行。
而主要的不同在于LOCK IN SHARE MODE 在有一方事务要Update 同一个表单时很容易造成死锁。