我正在使用两个窗口,因为我想实现事务的概念。
Window1:begin;
Window1:update employee set salary = 45000 where ssn = '123456789';
Window2:begin;
Window2:select * from employee where ssn = '123456789';
此处,此命令显示以前的数据是正确的。
Window1:commit;
Window2:select * from employee where ssn = '123456789';
在这里,我应该获得45000的更新工资。但我的窗口2仅显示以前的数据。我在哪里做错了?
答案 0 :(得分:1)
你的期望是不正确的,就是这样。从彼此的工作中看到的交易由所谓的transaction isolation levels决定。默认情况下,mysql使用repeatable read isolation level,这意味着:
如果事务隔离级别是REPEATABLE READ(默认值) 等级),同一事务中的所有一致读取读取 由该事务中的第一个这样的读取建立的快照。您 通过提交当前可以为您的查询获取更新的快照 交易以及发出新查询之后。
您可以将隔离级别更改为read committed以启用您期望的行为:
使用READ COMMITTED隔离级别,事务中的每个一致读取都会设置并读取自己的新快照。