事务处理控制Word下载.docx

上传人:b****6 文档编号:21813066 上传时间:2023-02-01 格式:DOCX 页数:17 大小:21.78KB
下载 相关 举报
事务处理控制Word下载.docx_第1页
第1页 / 共17页
事务处理控制Word下载.docx_第2页
第2页 / 共17页
事务处理控制Word下载.docx_第3页
第3页 / 共17页
事务处理控制Word下载.docx_第4页
第4页 / 共17页
事务处理控制Word下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

事务处理控制Word下载.docx

《事务处理控制Word下载.docx》由会员分享,可在线阅读,更多相关《事务处理控制Word下载.docx(17页珍藏版)》请在冰豆网上搜索。

事务处理控制Word下载.docx

台计算机接入了程序并开始工作

几分钟以后你注意到了一个你没有预见的问题一个出纳员向帐号中存入了一张支

票而另一个出纳则从相同的帐号中提出了一部分钱在分钟之内由于多用户的同时操作

就导致的帐目无法平衡很不幸由于他们之间互相进行更新和写入操作你的应用程序

很快就因为过负荷而断线我们假定出现这个问题的数据库名字叫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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1