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

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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...