事务处理控制Word下载.docx
《事务处理控制Word下载.docx》由会员分享,可在线阅读,更多相关《事务处理控制Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
台计算机接入了程序并开始工作
几分钟以后你注意到了一个你没有预见的问题一个出纳员向帐号中存入了一张支
票而另一个出纳则从相同的帐号中提出了一部分钱在分钟之内由于多用户的同时操作
就导致的帐目无法平衡很不幸由于他们之间互相进行更新和写入操作你的应用程序
很快就因为过负荷而断线我们假定出现这个问题的数据库名字叫CHECKING它有两个
表其内容如下所示
表11.1
NameAddressCityStateZipCustomer_ID
BillTurner725N.DealParkwayWashingtonDC200851
JohnKeith1220ViaDeLunaDr.JacksonvilleFL335812
MaryRosenberg482WannamakerAvenueWilliamsburgVA234783
DavidBlanken405N.DavisHighwayGreenvilleSC296524
RebeccaLittle7753WoodsLaneHoustonTX387645
表11.2
Average_BalCurr_BalAccount_ID
1298.53854.221
5427.226015.962
211.25190.013
73.7925.874
1285.901473.755
1234.561543.676
345.25348.037
假定你的应用程序为BILLTurner运行了SELECT查询并得到如下结果
OUTPUT
225
NAMEBillTurner
ADDRESS725N.DealParkway
CITYWashington
STATEDC
ZIP20085
CUSTOMER_ID1
当返回数据的时候另外一个用户连接到了数据库并更新了BILLTurner的住址信息
INPUT
SQL>
UPDATECUSTOMERSSETAddress="
11741KingstowneRoad"
WHEREName="
BillTurner"
你现在看到了如果在你执行SELECT语句当中出现的更新操作的话那么你所得到的
结果将是不正确的如果你的应用程序可以生成一个信件给BillTurner那么由于地址是
错误的如果信已经发送了那你是不能对地址进行修改的但是如果你使用了事务处理
机制那么你就可以对检测到错误的数据进行修改你所进行的所有操作也都可以撤消
开始事务处理
事务处理在执行上是非常简单的你需要检查你所执行的语法是OracleRDBMSSQL
语法还是SybaseSQLServerSQL语法
所有支持事务处理的系统都必须以一种准确的语法来告诉系统一项事务是如何开始的
不要忘记事务处理只是工作的逻辑分组它有自己的开始和结束在使用PERSONAL
ORACLE7时它的语法形式如下
SYNTAX
SETTRANSACTION{READONLY|USEROLLBACKSEGMENTsegment}
SQL标准要求每一种数据库的SQL解释器都必须运支持语句级的读一致这也就是
说当某一条语句运行的时候数据必需保持不变但是在许多情况下在一个工作过程中
必须要求数据保持有效而不仅仅是对单个语句ORACLE允许用户用SETTRANSACTION
来指定事务的开始如果你想检查BILLTUNER的信息并且要保证数据在这之中是不能改
变的那么你可以使用如下语句
226
SETTRANSACTIONREADONLY
SELECT*FROMCUSTOMERS
WHERENAME='
BillTurner'
;
COMMIT
我们将在今天的晚些时候来讨论COMMIT语句这里的SETTRANSACTIONREAD
ONLY允许你锁定一个记录集直到事务结束你可以在下列语句中使用READONLY选项
SELECT
LOCKTABLE
SETROLE
ALTERSESSION
ALTERSYSTEM
选项USEROLLBACKSEGMENT告诉ORACLE数据库提供数据回溯的存储空间段
这一选项是ORACLE对标准的SQL的扩展如果需要维护你的数据库请参见ORACLE的
帮助文档以获得更多的帮助信息
SQLServer'
sTransact-SQL语言用下边的方法来实现了开始事务处理的命令
begin{transaction|tran}[transaction_name]
它的实现方法与ORACLE的有一些不同SYBASE不允许你指定READONLY选
项但是SYBASE允许你给出事务处理的名字从最早的事务到最近发生的事务处理都
可以一次退回
1>
begintransactionnew_account
2>
insertCUSTOMERSvalues("
IzettaParsons"
"
1285PineappleHighway"
Greenville"
AL"
32854,6)
3>
ifexists(select*fromCUSTOMERSwhereName="
)
4>
begin
5>
begintransaction
6>
insertBALANCESvalues(1250.76,1431.26,8)
7>
end
8>
else
227
9>
rollbacktransaction
10>
ifexists(select*fromBALANCESwhereAccount_ID=8)
11>
12>
13>
insertACCOUNTSvalues(8,6)
14>
15>
16>
17>
ifexists(select*fromACCOUNTSwhereAccount_ID=8andCustomer_ID=6)
18>
committransaction
19>
20>
21>
go
现在请不要担心ROLLBACKTRANSACTION和COMMITTRANSACTION语句
重要的问题是这是一个内嵌的事务处理或者说是事务处理之中还有事务处理
注意最开始的事务处理在第1行之后是插入语句你检查了插入确实已经执行了
以后第二个事务处理在第5行开始这种在事务之中的事务在术语上称为内嵌事务
有一些数据库支持AUTOCOMMIT选项它可以在SET命令中使用如下例
SETAUTOCOMMIT[ON|OFF]
默认情况上SETAUTOCOMMITON命令在启动时是自动运行的它告诉SQL自动确
认你所运行的所有的语句如果你不想让这个命令自动运行那么请将它的参数设为NO
SETAUTOCOMMITOFF
注请检查你的数据库文档确认在你的数据库系统中一项事务处理是如何开始的
结束事务处理
在ORACLE语法中结束事务处理语句的语法如下
COMMIT[WORK]
[COMMENT'
text'
228
|FORCE'
[,integer]];
它的命令语法与Sybase的语法是相同的
语法
COMMIT(TRANSACTION|TRAN|WORK)(TRANSACTION_NAME)
COMMIT命令将保存在一项事务中所进行的所有的改变在开始一项事务处理之前要
先运行COMMIT命令以确保在之前没有事务未被确认
在下边的例子中如果COMMIT没有收到任何系统错误的情况下它将会执行确认
COMMIT;
SETTRANSACTIONREADONLY;
---DoOtherOperations---
在ORACLE中COMMIT语句的使用方法如下
SETTRANSACTION;
INSERTINTOCUSTOMERSVALUES
("
JohnMacDowell"
2000LakeLungeRoad"
Chicago"
IL"
42854,7);
SELECT*FROMCUSTOMERS;
CUSTOMER表的内容如下
IzettaParsons1285PineappleHighwayGreenvilleAL328546
JohnMacDowell2000LakeLungeRoadChicagoIL428547
而SybaseSQL使用COMMIT的语法方式如下
229
begintransaction
insertintoCUSTOMERSvalues
42854,7)
committransaction
go
select*fromCUSTOMERS
上边的语句完成了与ORACLE7相同的功能但是在使用COMMIT确认事务处理
之前你应该确保在该事务中的工作是正确无误的
注COMMITWORD命令与COMMIT命令的作用是相同的或Sybase中的COMMIT
TRANSACTION它与ANSISQL的语法一样的简单
切记COMMIT语句一定要与之前的SETTRANSCATION或BEGINTRANSCATION
语句一致注意在下边的语句中你将会收到错误信息
OracleSQL
INSERTINTOBALANCESvalues(18765.42,19073.06,8);
COMMITWORK;
SybaseSQL
insertintoBALANCESvalues(18765.42,19073.06,8)
commitwork
230
取消事务处理
在一个事务处理的过程中常常会运行一些错误检查以确认在过程中是否语句是运行
成功你可以使用ROLLBACK语句来撤消事务中所做的每一项工作即便工作是成功的
你也可以撤消但是这必须是在COMMIT之前ROLLBACK语句必须在一个事务之中
运行它可以一直撤消到事务的开始也就是说数据库会一直返回到事务处理刚开始的
状态在ORACLE7中它的语法形式如下
ROLLBACK[WORK]
[TO[SAVEPOINT]savepoint
]
如你所见该命令可以设置事务的SAVEPOINT我们将在今天的晚些时候来讨论这
项技术
SybaseTransact-SQL'
s的ROLLBACK语句与COMMIT语句非常相似
rollback{transaction|tran|work}[transaction_name|savepoint_name]
一个ORACLE的命令序列如下
BubbaMacDowell"
2222BlueLakeWay"
Austin"
TX"
39874,8);
ROLLBACK;
231
而ASybaseSQL的命令序列则如下
insertintoCUSTOMERSvalues
39874,8)
你也看到了由于使用了ROLLBACK命令撤消了INSERT命令新的记录并没有被
加入到表中
如果你写了一个图形用户界面的应用程序比如MICROWINDOWS你可以做一个
数据库查询对话框以便让用户在其中输入数值如果用户按下了确定按钮那么数据
库将会保存所做的改动如果用户按下了取消按钮那么所有的更改就会被取消显
然这种情况给予了你使用事务处理的机会
注下边的代码给出的ORACLESQL中的使用方法注意这里有SQL>
并且有行号
在随后给出的SybaseSQLsyntax中则没有SQL>
提示符
当对话框载入后这些SQL语句将会运行
SELECTCUSTOMERS.NAME,BALANCES.CURR_BAL,BALANCES.ACCOUNT_ID
2FROMCUSTOMERS,BALANCES
3WHERECUSTOMERS.NAME="
RebeccaLittle"
SQL21日自学通(V1.0)翻__________译人笨猪
232
4ANDCUSTOMERS.CUSTOMER_ID=BALANCES.ACCOUNT_ID;
该对话框允许用户更改当前的结算账号所以你需要将该数据返回给数据库
当按下OK按钮以后UPDATE将会运行
UPDATEBALANCESSETCURR_BAL='
new-value'
WHEREACCOUNT_ID=6;
如果用户按下了CANCEL那么将会运行ROLLBACK命令
ROLLBACK
当该对话框在SybaseSQL中被载入以后将会运行下边的语句
selectCUSTOMERS.Name,BALANCES.Curr_Bal,BALANCES.Account_ID
fromCUSTOMERS,BALANCES
whereCUSTOMERS.Name="
andCUSTOMERS.Customer_ID=BALANCES.Account_ID
该对话框允许用户改变当前的结算账号当你将该数据返回给数据库以后并按下OK
按钮时UPDATE语句将会运行
updateBALANCESsetCurr_BAL='
WHEREAccount_ID=6
如果用户选择了CANCEL按钮那么将会执行ROLLBACK的语句
ROLLBACK语句将会终止整个事务当存在嵌套事务时ROLLBACK将会终止掉全
部事务系统将会返回到事务开始的最初状态
如果当前没有活动的事务时ROLLBACK或COMMIT语句将不会对数据库产生任何
233
作用你可以认为这是一个无效的命令
在COMMIT语句运行以后在事务中的所有动作都会得到确认这时在使用
ROLLBACK命令就太晚了
在事务中使用保存点
在事务中使用ROLLBACK可以取消整个的事务但是你也可以在你的事务当中使用
语句进行部分地确认在Sybase和Oracle中都允许你在当前事务中设一个保存点从
这一点开始如果你使用了ROLLBACK命令那么系统将会回到保存点时的状态而在
保存点之前的语句将会得到确认在ORACLE中创建一个保存点的语法格式如下
SAVEPOINTsavepoint_name;
在SYBASE中创建保存点的语法格式如下
savetransactionsavepoint_name
下边是使用ORACLE语法的例子
SETTRANSACTION
UPDATEBALANCESSETCURR_BAL=25000WHEREACCOUNT_ID=5
SAVEPOINTsave_it
DELETEFROMBALANCESWHEREACCOUNT_ID=5