要回滚修改,必须在事务内执行修改。只有当执行 BEGIN WORK 语句时,不兼容 ANSI 的数据库中的事务才会开始。
在兼容 ANSI 的数据库中,事务始终有效。
数据库服务器让您打开和关闭保持游标以便在事务之外执行更新操作;但是,应当先取得所有与给定修改有关的行,然后在一个单独的事务中执行所有的修改。您无法在事务之外打开和关闭保持游标或更新游标。
EXEC SQL declare q_curs cursor for select customer_num, fname, lname from customer where lname matches :last_name for update; EXEC SQL open q_curs; EXEC SQL begin work; EXEC SQL fetch q_curs into :cust_rec; /* fetch after begin */ EXEC SQL update customer set lname = 'Smith' where current of q_curs; /* no error */ EXEC SQL commit work;
当更新事务内的行时,该行保持为锁定状态,直到游标被关闭或者是事务被提交或回滚。如果在没有任何事务是有效的时候对行进行更新,则在将修改的行写到磁盘时会释放该行锁定。如果在事务之外更新或删除行,则无法回滚该操作。
在使用事务的数据库中,您无法在事务之外打开一个插入游标,除非也使用 WITH HOLD 关键字声明了该插入游标。