【发布时间】:2015-04-19 14:46:09
【问题描述】:
我来自 oracle 背景,我对 SQL Server 有点困惑。
我想阻止 SQL Server 在我的插入命令上自动提交。所以我使用begin transaction。在下面的演示中,我将 100 行插入到一个测试表中,并且我将在事务结束时回滚。我期望的结果是 90 行(提交应该在 30、60 和 90 行),其余 10 条记录应该回滚。
CREATE TABLE test (TEST_ID INT);
GO
DECLARE @cnt INT=0;
BEGIN TRANSACTION t1;
WHILE @cnt < 100
BEGIN
INSERT INTO test values (@cnt);
SET @cnt += 1;
if (@cnt %30 = 0)
print 'commit '+cast(@cnt as varchar(100))
COMMIT TRANSACTION t1;
END
rollback transaction t1;
GO
首先,我确保我的 SQL Server Management Studio 自动提交已关闭,为此我遵循以下步骤:
Tools > Option > Query Execution > Sql Server > Ansi > checked the SET IMPLICIT_TRANSACTION
之后我运行了脚本,但我得到了错误的结果和一些错误。
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
行数为100!
当我插入让说 100 行而不提交最后一个让说 10 行时,我试图关闭我的连接并在 oracle 中再次打开它,其他人可以看到 90 行,但我看到 100 行,因为它是已经保存在我的会话中。但看起来 SQL Server 在会话和事务方面的行为有所不同。
我面临的另一个问题是关于 while 循环内的提交,看起来它无法访问循环外的开始事务。当我运行命令时,我没有选择任何东西。只需按 f5。即使我尝试了选择命令并运行,但它仍然给了我以下错误:
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
我对 SQL Server 越来越着迷了,我可以用 mysql 和 oracle 轻松地工作,但是 SQL Server ....
【问题讨论】:
-
这非常简单,真的:一旦您开始 一个事务 (
T1),它就会一直存在,直到您调用COMMIT或ROLLBACK为止。因此,一旦您插入 30 行并调用COMMIT- 然后 transactionT1已完成 并完成。时期。T1周围不再有交易 - 那么下次当您致电COMMIT T1或ROLLBACK T1时您会期待什么?!?!? 没有交易了 -
@marc_s,感谢您的编辑,正如 Giorgi Nakeuri 所写,我需要保存交易而不是提交
标签: sql-server tsql