事务处理控制
目标:
l 基本的事务控制
l 如何确认或终止某一项事务
l Sybase与Oracle在事务处理上的不同
概念:
事务控制:关系数据库执行数据库事务的能力。
事务:在逻辑上必须完成的一命令序列的单位。
开始事务处理:
所有支持事务处理的系统都必须以一种准确的语法告诉系统一项事务是如何开始的。
Oracle:
SET TRANSACTION {READ ONLY|USE ROLLBACK SEGMENT segment}
注意: SQL 标准要求每一种数据库的SQL 解释器都必须运支持语句级的读一致,这也就是说当某一条语句运行的时候数据必需保持不变.
Eg:
SQL> SET TRANSACTION READ ONLY
SQL> SELECT * FROM CUSTOMERS
WHERE NAME = 'Bill Turner';
SQL> COMMIT
这里的SET TRANSACTION READONLY 允许你锁定一个记录集直到事务结束。
SYSBASE开始事务的语法:
begin {transaction | tran} [transaction_name]
结束事务处理
Oracle 和sysbase语法相同:
COMMIT(TRANSACTION|TRAN|WORK)(TRANSACTION_NAME)
COMMIT 命令将保存在一项事务中所进行的所有的改变在开始一项事务处理之前要先运行COMMIT 命令以确保在之前没有事务未被确认。
Eg:在ORACLE 中COMMIT 语句的使用方法如下
INPUT
SQL> SET TRANSACTION;
SQL> INSERT INTO CUSTOMERS VALUES
("John MacDowell", "2000 Lake Lunge Road", "Chicago", "IL", 42854, 7);
SQL> COMMIT;
SQL> SELECT * FROM CUSTOMERS;
而Sybase SQL 使用COMMIT 的语法方式如下
1>begin transaction
2>insert into CUSTOMERS values
("John MacDowell", "2000 Lake Lunge Road", "Chicago", "IL", 42854, 7)
3>commit transaction
4>go
1>select * from CUSTOMERS
2>go
取消事务处理
在一个事务处理过程中,可以使用ROLLBACK语句来撤销事务中所作的每一项工作。但是ROLLBACK命令必须在commit之前。
ORACLE 7 中它的语法形式如下
SYNTAX
ROLLBACK [WORK]
[ TO [SAVEPOINT] savepoint
| FORCE 'text' ]
Eg:
SQL>SET TRANSACTION;
SQL>INSERT INTO CUSTOMERS VALUES
("","","","");
SQL>ROLLBACK;
SQL>SELECT* FROM CUSTOMERS ;
Sybase Transact-SQL's 的ROLLBACK语句与COMMIT 语句非常相似
SYNTAX
rollback {transaction | tran | work} [transaction_name | savepoint_name]
Eg:
1> begin transaction
2> insert into CUSTOMERS values
("Bubba MacDowell", "2222 Blue Lake Way", "Austin", "TX", 39874, 8)
3> rollback transaction
4> go
1> SELECT * FROM CUSTOMERS
2> go
上面两个例子中由于使用了ROLLBACK命令,表中的插入语句被撤销,
表中的数据未发生变化。
在事务中使用保存点
在事务中使用ROLLBACK可以撤销整个事务,但你也可以在事务中使用“部分的确认”。
在ORACLE中语法:
SAVEPOINT savepoint_name;
INPUT
SQL> SET TRANSACTION
SQL> UPDATE BALANCES SET CURR_BAL = 25000 WHERE ACCOUNT_ID = 5
SQL> SAVEPOINT save_it
SQL> DELETE FROM BALANCES WHERE ACCOUNT_ID = 5
SQL> ROLLBACK TO SAVEPOINT save_it
SQL> COMMIT
SQL> SELECT * FROM BALANCES
在SYSBASE中语法:
Save transaction savepoint_name;
1> begin transaction
2> update BALANCES set Curr_Bal = 25000 where Account_ID = 5
3> save transaction save_it
4> delete from BALANCES where Account_ID = 5
5> rollback transaction save_it
6> commit transaction
7> go
1> select * from BALANCES
2> go