2011-05-12 85 views
33

我不常使用存储过程,并想知道是否有意义在事务中包装我的select查询。使用事务处理select语句?

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

回答

34

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

如果这是您的应用程序中可能发生的情况,您应该使用事务来包装您的选择。确保你选择了正确的isolation level,但不是所有的事务类型都能保证一致的读取。

更新: 您也可以找到并发更新/插入解决方案this article(又名UPSERT)有趣。它提出了几种常用的upsert测试方法,以查看实际使用的方法保证数据在select和next语句之间未被修改。结果是令人震惊的,我会说。

+0

我使用服务代理与高度并发服务与类似的情况下,并有高死亡率下的SQL死锁问题。 应用这个建议和**特别是**上面提到的[文章](http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/)修复了所有的僵局 - 谢谢:-) – Sia 2016-09-20 21:04:37

2

通常在插入,更新或删除语句时使用事务,并且您希望具有原子行为,即提交每个事物或不提交任何内容。但是,您可以使用select语句的事务来确保没有其他人可以在执行大量选择查询时更新感兴趣的表。

看看这个msdn post

+2

你读过你的链接了吗? '应用程序可以执行操作,例如获取锁以保护SELECT语句的事务隔离级别'这是一个很好的用例,因为OP声明他们在后续查询中使用一个select的结果作为参数。 – JNK 2011-05-12 18:31:24