适用于:Azure Synapse Analytics
分析平台系统 (PDW)
事务由一组全部提交或全部回滚的一个或多个数据库语句组成。 每个事务都是原子级的、一致的、孤立的和持久的 (ACID)。 如果事务成功,其中的所有语句都将提交。 如果事务失败,则组中至少有一个语句失败,然后整个组都将回滚。
注意
Microsoft Fabric 数据仓库不支持该 SET AUTOCOMMIT 命令。 有关Microsoft Fabric 数据仓库中的事务、隔离、并发性和一致性的详细信息,请参阅 Fabric 数据仓库中的事务。
事务的开始和结束取决于 AUTOCOMMIT 设置和 BEGIN TRANSACTION、 COMMIT和 ROLLBACK 语句。
支持以下类型的事务:
显式事务以语句开头
BEGIN TRANSACTION,以或ROLLBACK语句结尾COMMIT。自动提交事务 在会话中自动启动,不以
BEGIN TRANSACTION语句开头。- 设置
AUTOCOMMIT完成后ON,每个语句在事务中运行,无需显式COMMIT或ROLLBACK是必需的。 -
AUTOCOMMITOFF设置时,需要一个或多个COMMITROLLBACK语句来确定事务的结果。 自动提交事务在语句COMMIT或ROLLBACK语句之后SET AUTOCOMMIT OFF立即开始。
- 设置
语法
BEGIN TRANSACTION [;]
COMMIT [ TRAN | TRANSACTION | WORK ] [;]
ROLLBACK [ TRAN | TRANSACTION | WORK ] [;]
SET AUTOCOMMIT { ON | OFF } [;]
SET IMPLICIT_TRANSACTIONS { ON | OFF } [;]
参数
开始事务
标记显式事务的起始点。
COMMIT [ WORK ]
标记显式或自动提交事务的末尾。 此语句会导致事务中的更改始终提交到数据库。 该语句
ROLLBACK [ WORK ]
将事务回滚到事务的起点。 事务的任何更改都不会提交到数据库。 该语句
SET AUTOCOMMIT { ON |OFF }
确定事务的启动和结束方式。
如果更改 AUTOCOMMIT 活动事务中的设置,该设置会影响当前事务,并且直到事务完成才会生效。
ON如果是AUTOCOMMIT,则运行另一个SET AUTOCOMMIT ON语句不起作用。 同样,如果是AUTOCOMMITOFF,则运行另一个SET AUTOCOMMIT OFF作不起作用。
ON
每个语句在其自己的事务下运行,不需要显式 COMMIT 或 ROLLBACK 语句。 允许在何时ON执行AUTOCOMMIT显式事务。
OFF
Azure Synapse Analytics 在事务尚未进行时自动启动事务。 任何后续语句作为事务的一部分运行,以及COMMITROLLBACK确定事务结果所必需的。 一旦事务在此作模式下提交或回滚,该模式就会保留 OFF,将启动一个新事务。 当是OFF时AUTOCOMMIT不允许显式事务。
SET IMPLICIT_TRANSACTIONS { ON |OFF }
这会切换与 . 相同的模式 SET AUTOCOMMIT。 当 ON, SET IMPLICIT_TRANSACTIONS 将连接设置为隐式事务模式。 当 OFF,它将返回与自动提交模式的连接。 有关详细信息,请参阅 SET IMPLICIT_TRANSACTIONS (Transact-SQL)。
权限
运行与事务相关的语句不需要特定权限。 运行事务内的语句需要相关权限。
错误处理
如果 COMMIT 或 ROLLBACK 正在运行且没有活动事务,则会引发错误。
如果在事务正在进行时运行 a BEGIN TRANSACTION ,则会引发错误。 如果在 BEGIN TRANSACTION 成功 BEGIN TRANSACTION 语句之后发生,或者会话处于下 SET AUTOCOMMIT OFF状态,则可能会出现这种情况。
如果运行时语句错误以外的错误阻止显式事务成功完成,数据库引擎会自动回滚事务并释放事务持有的所有资源。 例如,如果客户端的网络连接中断或客户端注销应用程序,则当网络通知中断实例时,将回滚连接的任何未提交的事务。
如果在批处理中出现运行时语句错误,Azure Synapse Analytics 的行为与 SQL Server XACT_ABORT 设置为 ON 一致,并且整个事务将回滚。 有关设置的详细信息 XACT_ABORT ,请参阅 SET XACT_ABORT (Transact-SQL)。
注解
给定时间内,一个会话只能运行一个事务;不支持保存点和嵌套事务。
仅当事务引用的所有数据在逻辑上正确时,程序员才负责颁发 COMMIT 。
如果会话在事务完成之前终止,事务将会回滚。
事务模式按会话级别进行管理。 例如,如果一个会话开始显式事务或设置为AUTOCOMMITOFF或设置为IMPLICIT_TRANSACTIONSON,则它不会影响任何其他会话的事务模式。
局限性
在发出语句后 COMMIT ,无法回滚事务,因为数据修改已成为数据库的永久部分。
CREATE DATABASE 和 DROP DATABASE (Transact-SQL) 命令不能在显式事务中使用。
Azure Synapse Analytics 没有事务共享机制。 这意味着,在任何给定时间点,只能有一个会话处理系统中的任何事务。
锁定行为
当多个用户同时访问数据时,锁定可以确保事务的完整性并保持数据库的一致性。 隐式和显式事务均可使用锁定。 每个事务对所依赖的资源(如表或数据库)请求不同类型的锁。
所有锁都是表级别或更高级别的。 锁可以阻止其他事务以某种可能会导致事务请求锁出错的方式修改资源。 每个事务将在不再依赖锁定资源时释放锁;显式事务会保留锁,直到事务完成(提交或回滚)。
例子
A. 使用显式事务
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. 回滚打开的事务
以下示例显示了回滚事务的效果。 在此示例中, ROLLBACK 该语句回滚 INSERT 该语句,但创建的表仍将存在。
CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
ROLLBACK;
C. 设置 AUTOCOMMIT
以下示例将 AUTOCOMMIT 设置设置为 ON.
SET AUTOCOMMIT ON;
以下示例将 AUTOCOMMIT 设置设置为 OFF.
SET AUTOCOMMIT OFF;
D. 使用隐式多语句事务
SET AUTOCOMMIT OFF;
CREATE TABLE ValueTable (id INT);
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
COMMIT;