提交和回滚冲突

时间:2014-06-30 06:34:38

标签: sql-server commit rollback

我在Microsoft SQL Server Management Studio上执行此查询时面临一个问题

CREATE DATABASE myDB
USE myDB

CREATE TABLE udata(uid INT PRIMARY KEY identity(101, 2),
    uname VARCHAR(25), unum INT UNIQUE)

CREATE TABLE usalary(sid INT PRIMARY KEY identity(1, 1),
    salary NUMERIC(18, 0), FKuid INT REFERENCES udata(uid))

INSERT INTO udata VALUES ('yogesh', 99)
INSERT INTO udata VALUES ('tejas',  88)

INSERT INTO usalary VALUES (15000, 103)


BEGIN TRANSACTION
SAVE TRANSACTION SP1
DELETE FROM udata WHERE uid = 1
COMMIT;
ROLLBACK to SP1
SELECT * FROM udata WHERE uid=1

BEGIN TRANSACTION
SAVE TRANSACTION SP2
TRUNCATE TABLE usalary
COMMIT
ROLLBACK to SP2
SELECT * FROM usalary

这里当我们提交事务时它应该保存在数据库中但是在回滚后数据会回来。怎么可能?

我的问题很简单。 在SQL文档中,提到在提交任何查询或事务后我们无法回滚。(我们无法获得以前的数据库状态。) 就像我们创建保存点a并对我们的数据库执行删除查询并显式提交提交一样。 文档说我们不能从这个状态回滚,但如果我在这里执行rollback命令,我会收回我的数据。

这里提到了一系列命令(查询),以便于从create database命令到rollback命令的帮助。

1 个答案:

答案 0 :(得分:1)

对于这样的查询:

BEGIN TRANSACTION
SAVE TRAN t1
DELETE FROM udata;
COMMIT;
ROLLBACK TRANSACTION t1

您将收到错误:The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.。当然,提交后没有回滚。

但是如果你试图将它包装在另一个交易中:

BEGIN TRANSACTION
    BEGIN TRANSACTION
    SAVE TRAN t1
    DELETE FROM udata;
    COMMIT;
    ROLLBACK TRANSACTION t1
COMMIT

这样可以正常工作。为什么? documentation on Nesting Transactions说:

  

SQL Server数据库引擎会忽略提交内部事务。根据最外层事务结束时采取的操作,提交或回滚事务。

我的猜测是:要么您不在此处发布整个查询,并且在其他地方有一个BEGIN TRANSACTION语句,要么您一直在管理Studio内部和您执行BEGIN TRANSACTION的某个地方测试事务而没有匹配ROLLBACKCOMMIT。在后一种情况下,尝试执行单ROLLBACK语句,直到出现错误。您也可以重新启动Management Studio。