myInoDB 支持事务,会产生脏读和幻读和不可重复读。
mysql支持四种事物隔离级别,默认:可重复读。
select * , select * for update,select * in share mode
一般用select * 就行了,默认读快照版本问题不大。
比较严格为了保证数据students和books 数据一致性,多表的数据一致性,可以用 share mode。
参考好文: https://www.cnblogs.com/itZhy/p/8417763.html
select .. for update还会阻塞其他事务对结果集最新版本的读取。
业务层面在什么情况下需要阻塞其他事务对结果集最新版本的读取呢?
select ... for update
本读取模式拥有select ... in share mode的一切功能,同时它还额外具备阻止其他事务读取最新版本的能力。
本读取模式在读取前后对资源的处理如下:
1. 读取行为发生之前,获取写锁。这意味着如果有其他尚未提交的事务已经修改了结果集,本读取模式会等待这些事务结束,以确保自己稍后可以读取到这些事务对结果集的修改。
2. 读取行为发生之后,当前事务提交之前,本读取模式会阻塞其他事务对结果集的修改,也会阻塞其他事务对结果集最新版本的读取(注:其他事务仍可以读取快照版本)。
3. 当前事务提交后,释放写锁。这意味着所有之前被阻塞的事务可恢复继续执行。
不想让别人也可以读取到最新版本,往往是因为自己想在最新版本上进行修改,同时担心其他人也和自己一样。因为大家在修改数据时,总是希望自己的修改与数据的最新版本(而不是历史版本)合并后存入数据库中,所以大家在修改数据前,都会尝试获取数据的最新版本,基于最新版本进行修改。如果每个人都可以同时获取到数据的最新版本并在最新版本上加入自己的修改,最后大家一起提交数据,必然会出现一个人的修改覆盖了其他人修改的情况,这就是经典的“更新丢失”问题。