微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server-2005 – T-SQL是否存储过程执行“atomic”?

假设我有一个简单的存储过程,看起来像这样(注意:这只是一个例子,而不是一个实际的过程):
CREATE PROCEDURE incrementCounter AS

DECLARE @current int
SET @current = (select CounterColumn from MyTable) + 1

UPDATE
    MyTable
SET
    CounterColumn = current
GO

我们假设我有一个名为’myTable’的表,其中包含一行,’CounterColumn’包含我们当前的计数.

这个存储过程可以同时执行多次吗?

这是可能的:

我叫“incrementCounter”两次.调用A到达设置“当前”变量的点(假设是5).调用B到达设置“当前”变量(也将为5)的位置.呼叫A完成执行,然后呼叫B完成.最后,表应该包含6的值,而是由于执行的重叠而包含5

解决方法

这是针对sql Server的.

每个语句都是原子的,但是如果您希望存储过程是原子的(或一般的语句序列),则需要明确地将语句包围在

开始交易
声明…
声明…
提交交易

(通常使用BEGIN TRAN和END TRAN).

当然有很多方法可以解决锁定问题,这取决于同时发生了什么,所以您可能需要处理失败事务的策略. (完全讨论可能导致锁定的所有情况,无论您如何设计这个特定的SP,都超出了问题的范围).但是由于原子性,它们仍然会重新出现.在我的经验中,你可能会很好,不知道你的交易量和数据库上的其他活动.请原谅说明明显的.

与流行的误解相反,这将在您的情况下使用认的交易级别设置.

原文地址:https://www.jb51.cc/mssql/82860.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐