【发布时间】:2011-05-12 18:19:00
【问题描述】:
我不经常使用存储过程,我想知道将我的选择查询包装在事务中是否有意义。
我的过程有三个简单的选择查询,其中两个使用第一个的返回值。
【问题讨论】:
-
第一个语句可能不需要在事务中
标签: sql-server tsql stored-procedures
我不经常使用存储过程,我想知道将我的选择查询包装在事务中是否有意义。
我的过程有三个简单的选择查询,其中两个使用第一个的返回值。
【问题讨论】:
标签: sql-server tsql stored-procedures
在高度并发的应用程序中,可能(理论上)发生在执行其他选择之前修改您在第一个选择中读取的数据。
如果您的应用程序中可能出现这种情况,您应该使用事务来包装您的选择。请确保您选择了正确的 isolation level,但并非所有事务类型都能保证一致的读取。
更新: 您还可以在并发更新/插入解决方案(又名 upsert)上发现 this article 很有趣。它将几种常见的 upsert 方法进行测试,以查看在 select 和 next 语句之间实际上 保证 数据没有被修改的方法。结果令人震惊。
【讨论】:
事务通常用于当您有CREATE、UPDATE 或DELETE 语句并且您希望具有原子行为,即要么提交所有内容,要么不提交任何内容。
但是,您可以使用READ select 语句的事务来:
确保在执行您的选择查询时没有其他人可以更新感兴趣的表。 p>
看看这个msdn post。
【讨论】:
An application can perform actions such as acquiring locks to protect the transaction isolation level of SELECT statements 这是一个很好的用例,因为 OP 声明他们在后续查询中使用一次选择的结果作为参数。