在这种情况下,我希望在存储过程中实现单个INSERT
,以确保具有事务形式的锁定机制。
这个文章说
如果您的过程不执行任何更新,或者只有一个INSERT/UPDATE/DELETE/MERGE语句,则通常根本没有显式事务。
这是否意味着存储过程是无用的?
提前谢谢。
发布于 2015-07-30 05:08:35
我想你误解了它的意思。通常有一个关键字。执行单个INSERT
语句时,操作自动为原子操作。即使您要插入1000行,它们要么全部插入,要么不插入。从某种意义上说,那里有一个隐含的事务。这个词通常很重要,因为虽然这个隐式事务是原子的,但是您不能自己回滚它。例如,您可能正在做这样的事情(人为的例子):
INSERT INTO MyLog (Record)
SELECT Record FROM OldLog
If (@@ROWCOUNT < 500)
ROLLBACK
您不能这样做,因为没有显式的事务。如果您将其包装在一个BEGIN TRANSACTION
中,现在就可以了。
但是,通常,当您有多个要成为原子语句的语句时,可以使用显式事务。例如,您要插入3个不同的表,需要它们全部成功或全部失败。通过拥有一个显式事务,您可以ROLLBACK
,这样您就不会以Table1被更新而Table2和Table3没有更新的状态结束。
所以我同意这个说法,通常当您有一个INSERT
时,您不需要一个显式的事务,但是可能会出现一些奇怪的情况,您需要一个事务。
发布于 2015-07-30 05:00:56
如果没有为插入指定事务,SQL将假设您不需要事务,并在proc结束后释放锁。
因此,只需使用显式事务来确定,例如:
BEGIN TRAN
INSERT ...
COMMIT TRAN
或者,使用相同的连接,显式启动事务,调用proc,然后在关闭连接之前显式提交事务。
https://stackoverflow.com/questions/31724410
复制相似问题