在选择语句中使用事务吗?

64

我很少使用存储过程,想知道将我的查询语句包装在一个事务中是否有意义。

我的存储过程有三个简单的查询语句,其中两个使用第一个查询语句的返回值。


第一条语句可能不需要在事务中。 - Jens Frandsen
3个回答

73
在高并发应用程序中,理论上可能会发生在执行其他查询之前修改了第一个查询中读取的数据的情况。
如果这是您的应用程序可能出现的情况,则应使用事务来包装您的查询。但请确保选择正确的隔离级别,因为不是所有事务类型都能保证一致性读取。
更新:您还可以找到此文章有关并发更新/插入解决方案(也称为upsert)的内容很有趣。它测试了几种常见的upsert方法,以查看哪种方法实际上保证数据在选择和下一个语句之间没有被修改。结果令人震惊。

1
我在一个高并发服务中使用了服务代理,并遇到了SQL死锁问题。 应用了这个建议,尤其是上面提到的文章,解决了所有死锁问题 - 谢谢 :-) - Sia

25

事务通常在有CREATEUPDATEDELETE语句时使用,并且您希望拥有原子行为,也就是说,要么全部提交,要么全部不提交

然而,您可以将事务用于READ选择语句,以便:
确保在执行一堆查询期间没有其他人可以更新感兴趣的表。

请参阅这篇msdn文章


3
你读了你提供的链接吗?“应用程序可以执行操作,例如获取锁来保护SELECT语句的事务隔离级别”,这是一个很好的使用案例,因为原帖中提到他们使用一个SELECT语句的结果作为后续查询的参数。 - JNK

1

大多数数据库即使没有指定,也会在事务中运行每个查询,即使它是隐式包装的。这包括选择语句。

实际上,PostgreSQL将每个SQL语句视为在事务中执行。如果您没有发出BEGIN命令,则每个单独的语句都有一个隐式的BEGIN和(如果成功)COMMIT包装。由BEGIN和COMMIT包围的一组语句有时称为事务块。

https://www.postgresql.org/docs/current/tutorial-transactions.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接