BEGIN WORK 语句

使用 BEGIN WORK 语句来启动事务(COMMIT WORK 或 ROLLBACK WORK 语句终止的一系列数据库操作,数据库服务器将其作为单个工作单元)。该语句是 SQL ANSI/ISO 标准的扩展.
用法
BEGIN WORK 语句只在支持事务日志记录的数据库中有效。该语句在 ANSI 兼容的数据库中无效。
在事务锁定期间 UPDATE 、DELETE 、INSERT 或 MERGE 语句影响的每行将在整个事务中保持锁定。包含许多这样的语句的事务或包含影响许多行的语句的事务,可超过您的操作系统或数据库服务器对同步锁定数目施加的限制。
如果没有其他用户访问该表,您可以在开始事务后通过使用 LOCK TABLE 语句来避免锁定限制并减少锁定开销。如同其它锁定一样,此表锁定在事务终止时释放。在 BEGIN WORK 的示例 的示例上的事务包含一条 LOCK TABLE 语句。
重要: 仅当事务不在进行时发出 BEGIN WORK 语句。如果当在事务中时发出一个 BEGIN WORK 语句,数据库服务器返回一条错误。
WORK 关键字是可选的。以下两条语句等价:
BEGIN;
BEGIN WORK;
在读取 SQL 源代码时忽略 WORK 关键字,不要混淆 SQL 的 BEGIN 语句和 SPL 关键字 BEGIN ,它们和 END 关键字一起可用于 SPL 例程内定义语句块的分隔符。
在 GBase 8s ESQL/C 中,如果在 WHENEVER 语句调用的 UDR 中使用 BEGIN WORK 语句,则应在 ROLLBACK WORK 语句之前指定 WHENEVER SQLERROR CONTINUE 和 WHENEVER SQLWARNING CONTINUE 。如果 ROLLBACK WORK 语句碰到错误或者警告,则这些语句可防止程序发生无限循环。
BEGIN WORK 和兼容 ANSI 的数据库
在兼容 ANSI 的数据库中,不需要 BEGIN WORK 语句,因为事务是隐式的;每个 SQL 语句均在事务内部发生。当您在以下任一语句之后立即使用 BEGIN WORK 语句时,数据库服务器生成一条警告:
 DATABASE
 COMMIT WORK
 CREATE DATABASE
 ROLLBACK WORK
在兼容 ANSI 的数据库中,如果您在任何其它语句之后使用 BEGIN WORK 语句,数据库服务器会返回一条错误。
BEGIN WORK WITHOUT REPLICATION (ESQL/C)
当您使用 Enterprise Replication 进行数据复制时,可使用 BEGIN WORK WITHOUT REPLICATION 语句来启动不复制到其它数据库服务器的事务。
您无法将 BEGIN WORK WITHOUT REPLICATION 作为 GBase 8s ESQL/C 应用程序中的独立植入语句执行。而只能间接执行此语句。可以使用以下两种方法之一:
 可以使用 PREPARE 和 EXECUTE 语句的组合来准备并执行 BEGIN WORK WITHOUT REPLICATION 语句。
 可以使用 EXECUTE IMMEDIATE 语句,只用单独一个步骤就准备并执行 BEGIN WORK WITHOUT REPLICATION 。
不能将 DECLARE 游标 CURSOR WITH HOLD 与 BEGIN WORK WITHOUT REPLICATION 语句一起使用。
有关数据复制的更多信息,请参阅 GBase 8s Enterprise Replication 指南。
BEGIN WORK 的示例
当连续的 SQL 语句执行的是逻辑上的一个工作单元,您可以通过在 BEGIN WORK 和 COMMIT WORK 语句之间给它们分组来定义此事务。 如果此任务需求要求要么所有语句都执行成功,要么它们都没被执行,则您可以在启动事务 BEGIN 和成功完成此事务 COMMIT WORK (或者 ROLLBACK WORK ,如果程序检测到错误,则取消该事务)之间包含该事务的语句。
以下代码分段中,该事务锁定了 stock 表(LOCK TABLE),更改了 stock 表中的行(UPDATE),从 stock 表删除行(DELETE)并将行插入 manufact 表(INSERT)。在此示例中(没有错误处理),数据库服务器按顺序执行这些 SQL 语句:
BEGIN WORK;
LOCK TABLE stock;
UPDATE stock SET unit_price = unit_price * 1.10
WHERE manu_code = ‘KAR’;
DELETE FROM stock WHERE description = ‘baseball bat’;
INSERT INTO manufact (manu_code, manu_name, lead_time)
VALUES (‘LYM’, ‘LYMAN’, 14);
COMMIT WORK;
每个语句本身就是原子;它成功完成或者数据库从未更改。如果任一语句失败,其它语句仍会继续执行,其结果好像是失败语句从未尝试执行。当 COMMIT WORK 语句执行后,这些成功的变更将变成永久性的。
然而,一般情况下,事务被定义为带有错误处理,因此数据库服务器必须完整执行这一系列操作,或者完全不执行。在这种情况下,当您在单个事务中包含所有这些操作时,数据库服务器保证所有的语句完整地一个不漏地提交到磁盘,或者恢复到与事务开始之前完全相同的状态。
通过提交错误处理属性(例如,在 DB-Access 中设置 DBACCNOIGN 环境变量或者在 ESQL/C 中添加 EXEC SQL WHENEVER ERROR STOP),该事务可隐式地回滚,因为此程序由于一个错误而停止且没有执行 COMMIT WORK。更多细致的条件编码例如(ESQL/C)允许程序员在继续执行更大的程序时显式回滚该事务。
应用程序和 UDRs 中的错误处理和业务逻辑还可通过包含 SAVEPOINT 和 ROLLBACK TO SAVEPOINT 语句将事务分隔为一个或多个分区。如果在遇到错误后,或在事务的部分结构指示与业务规范或其它标准冲突之后发出 ROLLBACK TO SAVEPOINT 语句,只有在 ROLLBACK 语句和其指定或缺省的保存点之间的数据库的更改会被取消,而不是取消整个事务。ROLLBACK 之后当前事务继续该语句,包括数据未提交的变更或数据库超过保存点仍暂挂的操作的结构都将继续执行。直到整个事务被提交或回滚。任何已回滚语句持有的锁定将会保留直到此事务完全结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值