【发布时间】:2014-08-20 11:20:39
【问题描述】:
我在 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 并对我们的数据库执行删除查询并显式提交一样。 文档说我们不能从这个状态回滚,但是如果我在这里执行回滚命令,我会取回我的数据。
这里提到了整个命令(查询)系列,以方便希望从创建数据库命令到回滚命令的帮助。
【问题讨论】:
-
“它回来了”是什么意思?您预计会发生什么以及实际上发生了什么?
-
事务在try catch块中主要是可行的。
-
这里有些东西没有意义:udata 表的create table 和drop table 没有意义。此外,后面的插入语句假定 udata 表存在。也根本没有提交语句。你期望什么输出,产生什么输出?
标签: sql-server commit rollback