关于事务查询问题

2016-02-29 15:22:05 +08:00
 lxy
数据库 MySQL 。写了一段代码,程序大概是这样:

开始事务;
insert 数据 1; //合法数据。
select 数据 1; //为什么这里能够查询得到数据 1 ?事务没提交的时候,就可以查询了?
time.sleep(20); //使程序暂停。这时我在 Navicat 却查不到数据 1 ,这又是为什么?
提交事务; //commit 。提交之后可以在 Navicat 中查到。
1750 次点击
所在节点    MySQL
4 条回复
lecher
2016-02-29 15:33:10 +08:00
事务支持的是回滚,只要事务的 SQL 没有失败,自然都是成功。

所以实际情况就是执行语句 1 ,成功之后执行语句 2 ,这时候当然可以查询到语句 1 的处理,如果语句 2 失败,就会回滚,做语句 1 的反操作将数据清除。
b821025551b
2016-02-29 15:33:10 +08:00
All operations in a single transaction are visible to each other.
delavior
2016-02-29 17:41:09 +08:00
在同一个连接中插入或更新数据后,即使未提交,在本连接中也是可以查询的;但是使用新连接是查不到的。
yuriko
2016-02-29 17:46:06 +08:00
事务使得操作被打包,将几个操作原子化。
对于事务内操作来说,并没有影响。
对于事务失败,由于原子性,事务不可切割,所以表现为回滚。
对于其他的事务或请求,由于原子性,只会表现为事务已执行或未执行中的一种。由于你事务还未提交,意味着可能还有后续操作,所以 nacicat 变现为事务未执行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259912

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX