【发布时间】:2018-07-09 22:33:51
【问题描述】:
我正在创建一个 SQL Server 批处理文件来创建新的数据库对象、向表中插入数据等。如果其中一个操作失败,那么我不希望提交任何其他操作。
以下包装是否足以完成我正在尝试做的事情?:
BEGIN TRANSACTION
--script #1 - create Table1
--script #2 - create Sproc1
--script #3 - insert data load into Table1
COMMIT
因此,如果 SS 在嵌套在上面定义的事务中的任何脚本中遇到错误,则不会提交任何 SQL DDL 或数据加载,对吗?
我假设这里不需要明确的 ROLLBACK。在任何情况下我都需要显式包含 ROLLBACK 语句?
【问题讨论】:
-
您使用的是 InnoDb 还是 MySQL? MySQL 将
CREATE TABLE作为单个事务处理。因此,即使您将其放在外部事务包装器中,它也无法撤消。 -
我使用的是 SQL Server 2016
-
你会想要使用
BEGIN TRY... CATCH和明确的ROLLBACK。 -
可以在事务中创建存储过程吗?
-
@Larnu - 如果在“BEGIN TRANSACTION”之后但在“COMMIT”之前发生错误,最新版本的 sql server 不会简单地在幕后回滚当前事务吗?
标签: sql sql-server tsql transactions acid