【问题标题】:Use transactions for select statements?将事务用于选择语句?
【发布时间】:2011-05-12 18:19:00
【问题描述】:

我不经常使用存储过程,我想知道将我的选择查询包装在事务中是否有意义。

我的过程有三个简单的选择查询,其中两个使用第一个的返回值。

【问题讨论】:

  • 第一个语句可能不需要在事务中

标签: sql-server tsql stored-procedures


【解决方案1】:

在高度并发的应用程序中,可能(理论上)发生在执行其他选择之前修改您在第一个选择中读取的数据。

如果您的应用程序中可能出现这种情况,您应该使用事务来包装您的选择。请确保您选择了正确的 isolation level,但并非所有事务类型都能保证一致的读取。

更新: 您还可以在并发更新/插入解决方案(又名 upsert)上发现 this article 很有趣。它将几种常见的 upsert 方法进行测试,以查看在 select 和 next 语句之间实际上 保证 数据没有被修改的方法。结果令人震惊。

【讨论】:

  • 我使用服务代理处理类似情况的高并发服务,并且在大容量下出现 sql 死锁问题。应用这个建议和尤其是上面提到的article修复了所有的死锁 - 谢谢:-)
【解决方案2】:

事务通常用于当您有CREATEUPDATEDELETE 语句并且您希望具有原子行为,即要么提交所有内容,要么不提交任何内容

但是,您可以使用READ select 语句的事务来:
确保在执行您的选择查询时没有其他人可以更新感兴趣的表。 p>

看看这个msdn post

【讨论】:

  • 您阅读了您的链接吗? An application can perform actions such as acquiring locks to protect the transaction isolation level of SELECT statements 这是一个很好的用例,因为 OP 声明他们在后续查询中使用一次选择的结果作为参数。
猜你喜欢
  • 2021-08-04
  • 2013-09-11
  • 1970-01-01
  • 2023-03-22
  • 2014-10-05
  • 2011-03-07
  • 2016-06-20
  • 2010-10-03
  • 1970-01-01
相关资源
最近更新 更多