事务顺序

事务顺序

问题一:

    更新1: start transaction; update t_emp set sal=1;commit;

    查询2:set session transaction isolation level read committed;start transaction; select sal from t_emp;commit;

    当两条语句同时运行的时候,更新1和查询2都已经start了,但是更新1还没有update,这个时候查询2会等待更新1commit?还是直接查询原始数据呢?为什么?


问题二:

    更新1: start transaction; update t_emp set sal=1;commit;

    更新2:set session transaction isolation level read uncommitted;start transaction; update t_emp set sal=2;commit;

    当两条语句同时运行的时候,更新1和更新2都commit了,最后结果sal是1还是2?是不是和两个commit先后顺序有关?有没有可能同时commit?结果又是什么?


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2022-06-05 10:43:09

同学你好~

问题一:

这里查询2的隔离级别设置的是read committed,即只会读取已经提交过的数据。而更新1的语句中,如果还未执行commit,那么该数据就未提交,不会被查询2读取到,即查询2读取的是原始数据。

问题二:

首先,由于开启了事务机制,不可能两个事务同时commit。这里如果是先事务1执行,在事务1commit之前,事务2处于等待状态,根本无法执行sql语句。

所以此时可以发现,最终的结果一定是哪个事务后执行的,结果就是其执行结果。因为先执行的事务结束之后才能执行另外的事务,而该事务会覆盖前面事务的结果。

祝学习愉快~


  • 提问者 慕的地5481427 #1

    事务机制不是在执行commit()之后,会把undo里面的所有sql都提交上去么?不可能两个事务同时commit是什么意思?

    当两个update都已经到了undo里面,执行commit()之后,不会一起提交吗?

    2022-06-05 20:08:54
  • 好帮手慕小尤 回复 提问者 慕的地5481427 #2

    同学你好,两个事务不可能同时commit,会有一个先后顺序。当第一个事务commit之前,事务2会先等待,等当第一个事务commit之后在进行处理。

    祝学习愉快!

    2022-06-06 10:25:05
  • 提问者 慕的地5481427 #3

    既然commit()之后有先后顺序,如果第一条是更新语句,第二条是查询语句,那么第二条查询语句设置read committed以后,那就得等第一条执行完了之后才会执行对嘛?

    2022-06-06 10:42:09
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师