DB 开启了事务但只做了 select,请问是 commit 还是 roll back 耗资源?

2015-08-07 23:50:00 +08:00
 abv
正确做法是什么,一直搞不明白,先谢了。
3932 次点击
所在节点    MySQL
12 条回复
imnpc
2015-08-08 07:36:45 +08:00
Selete 为什么要开启事务呢 一般不是写入重要操作的时候才需要吗
msg7086
2015-08-08 08:04:30 +08:00
没写入的话commit和rollback没区别呀,都是释放掉当前上下文。
hdshen
2015-08-08 08:14:36 +08:00
只做查询的时候 不开启事物

有db写入的时候 才开启
realpg
2015-08-08 09:12:13 +08:00
MySQL么?
第一,无更新操作不开启事务
第二,如果是“可能更新”而开启事务最后因为逻辑直接要结束,应该commit,因为rollback必然要进行一大堆内部逻辑。不过无写入rollback跟commit的开销差距极小,
sivacohan
2015-08-08 13:18:14 +08:00
PostgreSQL的话建议用commit
oclock
2015-08-08 23:44:36 +08:00
@msg7086 "idle in transaction"
msg7086
2015-08-09 00:35:13 +08:00
@oclock 没看懂,能详细说说么
abv
2015-08-09 15:03:13 +08:00
@imnpc
@msg7086
@hdshen
@realpg
这个算进入事务了吧?
select id from table where id=1 for update

@sivacohan 谢谢
@oclock 没太懂
oclock
2015-08-09 22:54:09 +08:00
不是开销问题,select for update之后到底有没有写动作,有的话肯定应该commit。一般可以这样
try:
db.session.execute(...)
...
db.session.commit()
except SQLAlchemy.Error:
db.session.rollback()

如果不捕捉异常,常常出现悬空连接idle in trasanction (postgresql),而数据库要过很久才会关闭这些连接
msg7086
2015-08-10 01:13:23 +08:00
@oclock 楼主问的是提交和滚回的性能区别…
oclock
2015-08-10 07:00:02 +08:00
@msg7086 rollback贵,常识
msg7086
2015-08-10 09:05:02 +08:00
@oclock 有多常识麻烦说说?

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

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

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

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

© 2021 V2EX