不同之处在于您所谓的“标准命令”具有隐式事务(如“非显式”和非真正的隐式事务,这意味着有所不同),因此每次您发出INSERT
不带显式事务的命令时,它都会打开一个事务,插入数据并自动提交。这称为自动提交事务。
这也是为什么您不能回滚INSERT
它的原因:它已经提交了。因此,规则与显式事务相同:提交后就无法回滚。
您可以直接从SQL Server内部了解我的意思。
Microsoft随SQL Server一起提供了一个称为DMF的DMF,该DMF sys.fn_dblog
可用于查看给定数据库的事务日志。
对于这个简单的实验,我将使用AdventureWorks数据库:
USE AdventureWorks2008;
GO
SELECT TOP 10 *
FROM dbo.Person;
GO
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
BEGIN TRAN;
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
GO
SELECT *
FROM sys.fn_dblog(NULL, NULL);
GO
在这里,我要进行两次插入:一次插入和一次插入都不进行显式事务。
在日志文件中,您可以看到两者之间绝对没有区别:
红色的是INSERT
自动提交事务中的,蓝色的是INSERT
显式事务中的。
至于您提到的第三方工具,是的,它们分析数据库日志并生成普通的T-SQL代码以“撤消”或“重做”操作。通常,我的意思是,除了生成将与日志文件中的内容完全相反的脚本之外,它们没有执行任何其他特殊操作。