事务处理:事务处理是指关系数据库执行数据库事务的能力,事务是指在逻辑上必须完成的命令序列的单位,单元工作期是指事务的开始和结束时间。
1、开始事务处理
所有支持事务处理的系统都必须以一种准确的语法来告诉系统一项事务是如何开始的 ,它有它自己的开始和结束。事务处理只是工作的逻辑分组。
在personal oracle中开始事务处理的语句为:
set transaction {read only | use rollback segment segment}
选项use rollback segment告诉oracle 数据库提供数据回溯的存储空间段。这一选项是 oracle 对标准的 SQL 的扩展
oracle允许用户用set transaction指定事务的开始,检查BILL TUNER 的信息并且要保证数据在这之中是不能改变的,使用语句:
set transaction read only;
select * from customers
where NAME='Bill Turner';
commit;
commit提交事务处理以后,锁定的记录集直到事务结束都是被锁定的状态。
可以在select、lock table、set role、alter session、alter system中使用read only语句。
SQL Server's Transact-SQL 语言用下边的方法来实现了开始事务处理的命令:
begin {transaction | tran} [transaction_name]
SYBASE不允许你指定READ ONLY 选项,sybase允许给出事务处理的名字,从最早的事务到最近发生的事务处理都可以一次退回。
begin transaction new_account
insert CUSTOMERS values ("Izetta Parsons", "1285 Pineapple Highway", "Greenville", "AL",32854, 6)
if exists(select * from CUSTOMERS where Name = "Izetta Parsons")
begin
begin transaction
insert BALANCES values(1250.76, 1431.26, 8)
end
else
rollback transaction
if exists(select * from BALANCES where Account_ID = 8)
begin
begin transaction
insert ACCOUNTS values(8, 6)
end
else
rollback transaction
if exists (select * from ACCOUNTS where Account_ID = 8 and Customer_ID = 6)
commit transaction
else
rollback transaction
go
最开始的事务处理在第 1 行,之后是插入语句,你检查了插入确实已经执行了以后,第二个事务处理在第 5 行开始,这种在事务之中的事务在术语上称为内嵌事务,或者说是事务处理之中还有事务处理。
2、结束事务处理
在oracle中结束事务处理语法为:
COMMIT [WORK]
[ COMMENT 'text'
|FORCE 'text' [, integer] ] ;
sybase结束事务处理语句:
COMMIT (TRANSACTION | TRAN | WORK) (TRANSACTION_NAME);
COMMIT 命令将保存在一项事务中所进行的所有的改变,在开始一项事务处理之前要先运行 COMMIT 命令以确保在之前没有事务未被确认。
如果COMMIT没有收到任何系统错误的情况下,将会执行确认。
COMMIT;
SET TRANSACTION READ ONLY;
SELECT * FROM CUSTOMERS
WHERE NAME = 'Bill Turner';
oracle中commit语句的使用方法为:
SET TRANSACTION;
INSERT INTO CUSTOMERS VALUES
("John MacDowell", "2000 Lake Lunge Road", "Chicago", "IL", 42854, 7);
COMMIT;
SELECT * FROM CUSTOMERS;
Sybase SQL使用commit的语法方式:
begin transaction
insert into CUSTOMERS values
("John MacDowell", "2000 Lake Lunge Road", "Chicago", "IL", 42854, 7)
commit transaction
go
select * from CUSTOMERS
go
COMMIT 语句一定要与之前的 SET TRANSCATION 或 BEGIN TRANSCATION 语句一致。
3、取消事务处理
使用 ROLLBACK 语句来撤消事务中所做的每一项工作,即便工作是成功的,也可以撤消。但是一定要在commit之前进行。
rollback生命周期:rollback语句产生于事务运行时到事务结束,可以一直进行事务的回滚。
oracle中的用法:
rollback[work] [ to [savepoint] savepoint | force 'text' ]
Sybase SQL中的用法:
rollback {transaction | tran | work} [transaction_name | savepoint_name]
使用oracle语句取消插入事务:
SET TRANSACTION;
INSERT INTO CUSTOMERS VALUES
("Bubba MacDowell", "2222 Blue Lake Way", "Austin", "TX", 39874, 8);
ROLLBACK;
SELECT * FROM CUSTOMERS;
使用select进行查询后,会发现插入并没有成功。
使用Sybase SQL语句取消插入事务:
begin transaction
insert into CUSTOMERS values
("Bubba MacDowell", "2222 Blue Lake Way", "Austin", "TX", 39874, 8)
rollback transaction
go
SELECT * FROM CUSTOMERS
go
现在有一个图形用户界面的应用程序,做一个数据库查询对话框以便让用户在其中输入数值,如果按下了“确定”按钮那么数据库将会保存所做的改动,如按下了“取消”按钮,则所有的更改就会被取消。
在对话框加载后,oracle处理语句为:
set TRANSACTION;
SELECT CUSTOMERS.NAME, BALANCES.CURR_BAL, BALANCES.ACCOUNT_ID
FROM CUSTOMERS, BALANCES
WHERE CUSTOMERS.NAME = "Rebecca Little"
AND CUSTOMERS.CUSTOMER_ID = BALANCES.ACCOUNT_ID;
//该对话框允许用户更改当前的结算账号,所以你需要将该数据返回给数据库。当按下确认按钮以后UPDATE将运行。
UPDATE BALANCES SET CURR_BAL = 'new-value' WHERE ACCOUNT_ID = 6;
COMMIT;
//如果用户按下了取消,那么将会运行ROLLBACK命令。
rollback;
Sybase SQL处理语句为:
begin transaction
select CUSTOMERS.Name, BALANCES.Curr_Bal, BALANCES.Account_ID
from CUSTOMERS, BALANCES
where CUSTOMERS.Name = "Rebecca Little"
and CUSTOMERS.Customer_ID = BALANCES.Account_ID
go
//按下确认键后进行update操作
update BALANCES set Curr_BAL = 'new-value' where Account_ID=6
commit transaction
go
//按下取消按钮后进行rollback
rollback transaction
go
4、在事务中使用保存点
用 ROLLBACK 可以取消整个的事务,在 Sybase 和 Oracle 中都允许你在当前事务中设一个保存点,从这一点开始,如果你使用了 ROLLBACK 命令,那么系统将会回到保存点时的状态,而在保存点之前的语句将会得到确认。
在oracle中创建一个保存点的语句:
savepoint savepoint_name;
在Sybase SQL中创建一个保存点的语句:
save transaction savepoint_name;
例: 创建一个叫 SAVE_IT 的保存点,使用UPDATE 语句更新CURR_BAL 列,在其后设置了一个保存点,在保存之后,运行了 DELETE 命令,系统退回到了保存点处,用 COMMIT 命令进行确认, 在保存点之前的命令得到了确认结果。 或者在其后又使用了 ROLLBACK 命令,则将会取消当前的事务而不会有任何的改变。oracle处理语句为:
SET TRANSACTION;
UPDATE BALANCES SET CURR_BAL = 25000 WHERE ACCOUNT_ID = 5;
SAVEPOINT save_it;
DELETE FROM BALANCES WHERE ACCOUNT_ID = 5;
ROLLBACK TO SAVEPOINT save_it;
//COMMIT;
rollback;
SELECT * FROM BALANCES;
Sybase SQL 处理:
begin transaction
update BALANCES set Curr_Bal = 25000 where Account_ID = 5
save transaction save_it
delete from BALANCES where Account_ID = 5
rollback transaction save_it
//commit transaction
rollback transaction
go
select * from BALANCES
go