Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 存储过程和触发器 » 使用过程、触发器和批处理 » 控制语句

 

原子复合语句

原子语句是或者完全执行,或者根本不执行的语句。例如,更新数千行的 UPDATE 语句在更新许多行后可能会遇到错误。如果该语句没有完成,则所有更改的行都恢复为其初始状态。UPDATE 语句即是原子语句。

所有非复合 SQL 语句都是原子语句。可以通过在 BEGIN 关键字后添加 ATOMIC 关键字来使复合语句成为原子语句。

BEGIN ATOMIC
   UPDATE Employees
   SET ManagerID = 501
   WHERE EmployeeID = 467;
    UPDATE Employees
   SET BirthDate = 'bad_data';
END

在此示例中,两个更新语句都属于原子复合语句。它们要么成功,要么失败,二者只能居其一。第一个更新语句将是成功的。第二个语句会引发数据转换错误,因为指派给 BirthDate 列的值无法转换为日期。

该原子复合语句会失败,因此两个 UPDATE 语句的结果都会被撤消。即使当前执行的事务最终被提交,原子复合语句中的这两个语句也都不会生效。

如果原子复合语句成功,则在复合语句中进行的更改直到当前执行的事务被提交的时候才会生效。如果原子复合语句成功而包含该语句的事务却回退,则原子复合语句也回退。在原子复合语句开始时建立一个保存点。语句中的任何错误都会导致回退到该保存点。

在自动提交(非链接)模式下执行原子复合语句时,直到完成语句执行后提交模式才变为到手动(链接)。在手动模式中,在原子复合语句中执行的 DML 语句不会引起快速 COMMIT 或 ROLLBACK。如果原子复合语句成功完成,将执行 COMMIT 语句;否则执行 ROLLBACK 语句。有关自动提交行为的详细信息,请参见设置自动提交或手工提交模式控制自动提交行为

在原子复合语句中不能使用 COMMIT 和 ROLLBACK 以及某些 ROLLBACK TO SAVEPOINT 语句。请参见过程和触发器中的事务和保存点

有一种情况下会只执行原子复合语句中的某些语句(而不是全部语句)。那就是当复合语句中的异常处理程序处理错误的时候。

有关详细信息,请参见在过程和触发器中使用异常处理程序