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

前端之家收集整理的这篇文章主要介绍了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,都超出了问题的范围).但是由于原子性,它们仍然会重新出现.在我的经验中,你可能会很好,不知道你的交易量和数据库上的其他活动.请原谅说明明显的.

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

猜你在找的MsSQL相关文章