事务处理控制.docx

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

事务处理控制.docx

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

事务处理控制.docx

事务处理控制

目标

如果你是一个临时用户只需要偶而使用SQL从数据库获得数据的话那么前十天的

的主题已经为你提供了足够的内容但是如果你想开发可以在使用数据库系统下运行的

专业应用程序这在当前在很普遍的那么你在今后四天中讲到的内容事务控制安全

内嵌SQL语句数据库过程将会对你有很大的帮助我们先从事务控制开始到今天的

结束我们将学会以下内容

?

?

基本的事务控制

?

?

如何确认或终止某一项事务

?

?

Sybase与Oracle在事务处理上的不同之处

注在今天的例子中我们使用PERSONALORACLE7和SYBASESQLSERVER对于你

所使用的解释器请查看相应的帮助文档以找出它们的不同之处

事务控制

事务控制或者说事务处理是指关系数据库系统执行数据库事务的能力事务是指在逻

辑上必须完成的一命令序列的单位单元工作期是指事务的开始和结束时期如果在事务

中产生的错误那么整个过程可以根据需要被终止如果每一件事都是正确的那么结果

将会被保存到数据库中

日后你也许会运行其于网络的多用户应用程序客户/服务环境就是为它而设计的传

SQL21日自学通(V1.0)翻译人笨猪

224

统上的服务器例如数据库服务器支持多个与它连接的工作站与其它技术一样新特

性提高了数据库的复杂程度下边的几段描述了一个银行所使用的应用程序

银行应用程序

假定你受雇于联邦银行并负责为他们设计一个支票管理系统你已经设计了一个非常

完美的数据库并且经常测试检验证明是正确无误的你在应用程序中调用它以后你从

账号中支取了20元并进行验证数据库中确实已经少了20元你又从帐号中存入了50.25

元并进行验证结果也与所期望的相同于是你骄傲在告诉你的老板系统可以运行了几

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

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

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

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

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

SQL21日自学通(V1.0)翻译人笨猪

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的信息并且要保证数据在这之中是不能改

变的那么你可以使用如下语句

INPUT

SQL21日自学通(V1.0)翻译人笨猪

226

SQL>SETTRANSACTIONREADONLY

SQL>SELECT*FROMCUSTOMERS

WHERENAME='BillTurner';

SQL>COMMIT

我们将在今天的晚些时候来讨论COMMIT语句这里的SETTRANSACTIONREAD

ONLY允许你锁定一个记录集直到事务结束你可以在下列语句中使用READONLY选项

SELECT

LOCKTABLE

SETROLE

ALTERSESSION

ALTERSYSTEM

选项USEROLLBACKSEGMENT告诉ORACLE数据库提供数据回溯的存储空间段

这一选项是ORACLE对标准的SQL的扩展如果需要维护你的数据库请参见ORACLE的

帮助文档以获得更多的帮助信息

SQLServer'sTransact-SQL语言用下边的方法来实现了开始事务处理的命令

SYNTAX

begin{transaction|tran}[transaction_name]

它的实现方法与ORACLE的有一些不同SYBASE不允许你指定READONLY选

项但是SYBASE允许你给出事务处理的名字从最早的事务到最近发生的事务处理都

可以一次退回

INPUT

1>begintransactionnew_account

2>insertCUSTOMERSvalues("IzettaParsons","1285PineappleHighway","Greenville","AL"

32854,6)

3>ifexists(select*fromCUSTOMERSwhereName="IzettaParsons")

4>begin

5>begintransaction

6>insertBALANCESvalues(1250.76,1431.26,8)

7>end

8>else

SQL21日自学通(V1.0)翻译人笨猪

227

9>rollbacktransaction

10>ifexists(select*fromBALANCESwhereAccount_ID=8)

11>begin

12>begintransaction

13>insertACCOUNTSvalues(8,6)

14>end

15>else

16>rollbacktransaction

17>ifexists(select*fromACCOUNTSwhereAccount_ID=8andCustomer_ID=6)

18>committransaction

19>else

20>rollbacktransaction

21>go

现在请不要担心ROLLBACKTRANSACTION和COMMITTRANSACTION语句

重要的问题是这是一个内嵌的事务处理或者说是事务处理之中还有事务处理

注意最开始的事务处理在第1行之后是插入语句你检查了插入确实已经执行了

以后第二个事务处理在第5行开始这种在事务之中的事务在术语上称为内嵌事务

有一些数据库支持AUTOCOMMIT选项它可以在SET命令中使用如下例

SETAUTOCOMMIT[ON|OFF]

默认情况上SETAUTOCOMMITON命令在启动时是自动运行的它告诉SQL自动确

认你所运行的所有的语句如果你不想让这个命令自动运行那么请将它的参数设为NO

SETAUTOCOMMITOFF

注请检查你的数据库文档确认在你的数据库系统中一项事务处理是如何开始的

结束事务处理

在ORACLE语法中结束事务处理语句的语法如下

SYNTAX

COMMIT[WORK]

[COMMENT'text'

SQL21日自学通(V1.0)翻译人笨猪

228

|FORCE'text'[,integer]];

它的命令语法与Sybase的语法是相同的

语法

COMMIT(TRANSACTION|TRAN|WORK)(TRANSACTION_NAME)

COMMIT命令将保存在一项事务中所进行的所有的改变在开始一项事务处理之前要

先运行COMMIT命令以确保在之前没有事务未被确认

在下边的例子中如果COMMIT没有收到任何系统错误的情况下它将会执行确认

INPUT

SQL>COMMIT;

SQL>SETTRANSACTIONREADONLY;

SQL>SELECT*FROMCUSTOMERS

WHERENAME='BillTurner';

---DoOtherOperations---

SQL>COMMIT;

在ORACLE中COMMIT语句的使用方法如下

INPUT

SQL>SETTRANSACTION;

SQL>INSERTINTOCUSTOMERSVALUES

("JohnMacDowell","2000LakeLungeRoad","Chicago","IL",42854,7);

SQL>COMMIT;

SQL>SELECT*FROMCUSTOMERS;

CUSTOMER表的内容如下

NameAddressCityStateZipCustomer_ID

BillTurner725N.DealParkwayWashingtonDC200851

JohnKeith1220ViaDeLunaDr.JacksonvilleFL335812

MaryRosenberg482WannamakerAvenueWilliamsburgVA234783

DavidBlanken405N.DavisHighwayGreenvilleSC296524

RebeccaLittle7753WoodsLaneHoustonTX387645

IzettaParsons1285PineappleHighwayGreenvilleAL328546

JohnMacDowell2000LakeLungeRoadChicagoIL428547

而SybaseSQL使用COMMIT的语法方式如下

SQL21日自学通(V1.0)翻译人笨猪

229

INPUT

1>begintransaction

2>insertintoCUSTOMERSvalues

("JohnMacDowell","2000LakeLungeRoad","Chicago","IL",42854,7)

3>committransaction

4>go

1>select*fromCUSTOMERS

2>go

NameAddressCityStateZipCustomer_ID

BillTurner725N.DealParkwayWashingtonDC200851

JohnKeith1220ViaDeLunaDr.JacksonvilleFL335812

MaryRosenberg482WannamakerAvenueWilliamsburgVA234783

DavidBlanken405N.DavisHighwayGreenvilleSC296524

RebeccaLittle7753WoodsLaneHoustonTX387645

IzettaParsons1285PineappleHighwayGreenvilleAL328546

JohnMacDowell2000LakeLungeRoadChicagoIL428547

上边的语句完成了与ORACLE7相同的功能但是在使用COMMIT确认事务处理

之前你应该确保在该事务中的工作是正确无误的

注COMMITWORD命令与COMMIT命令的作用是相同的或Sybase中的COMMIT

TRANSACTION它与ANSISQL的语法一样的简单

切记COMMIT语句一定要与之前的SETTRANSCATION或BEGINTRANSCATION

语句一致注意在下边的语句中你将会收到错误信息

OracleSQL

INPUT

SQL>INSERTINTOBALANCESvalues(18765.42,19073.06,8);

SQL>COMMITWORK;

SybaseSQL

INPUT

1>insertintoBALANCESvalues(18765.42,19073.06,8)

2>commitwork

SQL21日自学通(V1.0)翻译人笨猪

230

取消事务处理

在一个事务处理的过程中常常会运行一些错误检查以确认在过程中是否语句是运行

成功你可以使用ROLLBACK语句来撤消事务中所做的每一项工作即便工作是成功的

你也可以撤消但是这必须是在COMMIT之前ROLLBACK语句必须在一个事务之中

运行它可以一直撤消到事务的开始也就是说数据库会一直返回到事务处理刚开始的

状态在ORACLE7中它的语法形式如下

SYNTAX

ROLLBACK[WORK]

[TO[SAVEPOINT]savepoint

|FORCE'text']

如你所见该命令可以设置事务的SAVEPOINT我们将在今天的晚些时候来讨论这

项技术

SybaseTransact-SQL's的ROLLBACK语句与COMMIT语句非常相似

SYNTAX

rollback{transaction|tran|work}[transaction_name|savepoint_name]

一个ORACLE的命令序列如下

INPUT

SQL>SETTRANSACTION;

SQL>INSERTINTOCUSTOMERSVALUES

("BubbaMacDowell","2222BlueLakeWay","Austin","TX",39874,8);

SQL>ROLLBACK;

SQL>SELECT*FROMCUSTOMERS;

NameAddressCityStateZipCustomer_ID

BillTurner725N.DealParkwayWashingtonDC200851

JohnKeith1220ViaDeLunaDr.JacksonvilleFL335812

MaryRosenberg482WannamakerAvenueWilliamsburgVA234783

DavidBlanken405N.DavisHighwayGreenvilleSC296524

RebeccaLittle7753WoodsLaneHoustonTX387645

IzettaParsons1285PineappleHighwayGreenvilleAL328546

JohnMacDowell2000LakeLungeRoadChicagoIL428547

SQL21日自学通(V1.0)翻译人笨猪

231

而ASybaseSQL的命令序列则如下

INPUT

1>begintransaction

2>insertintoCUSTOMERSvalues

("BubbaMacDowell","2222BlueLakeWay","Austin","TX",39874,8)

3>rollbacktransaction

4>go

1>SELECT*FROMCUSTOMERS

2>go

NameAddressCityStateZipCustomer_ID

BillTurner725N.DealParkwayWashingtonDC200851

JohnKeith1220ViaDeLunaDr.JacksonvilleFL335812

MaryRosenberg482WannamakerAvenueWilliamsburgVA234783

DavidBlanken405N.DavisHighwayGreenvilleSC296524

RebeccaLittle7753WoodsLaneHoustonTX387645

IzettaParsons1285PineappleHighwayGreenvilleAL328546

JohnMacDowell2000LakeLungeRoadChicagoIL428547

你也看到了由于使用了ROLLBACK命令撤消了INSERT命令新的记录并没有被

加入到表中

如果你写了一个图形用户界面的应用程序比如MICROWINDOWS你可以做一个

数据库查询对话框以便让用户在其中输入数值如果用户按下了确定按钮那么数据

库将会保存所做的改动如果用户按下了取消按钮那么所有的更改就会被取消显

然这种情况给予了你使用事务处理的机会

注下边的代码给出的ORACLESQL中的使用方法注意这里有SQL>并且有行号

在随后给出的SybaseSQLsyntax中则没有SQL>提示符

当对话框载入后这些SQL语句将会运行

INPUT

SQL>SETTRANSACTION;

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将会运行

INPUT

SQL>UPDATEBALANCESSETCURR_BAL='new-value'WHEREACCOUNT_ID=6;

SQL>COMMIT

如果用户按下了CANCEL那么将会运行ROLLBACK命令

INPUT

SQL>ROLLBACK

当该对话框在SybaseSQL中被载入以后将会运行下边的语句

INPUT

1>begintransaction

2>selectCUSTOMERS.Name,BALANCES.Curr_Bal,BALANCES.Account_ID

3>fromCUSTOMERS,BALANCES

4>whereCUSTOMERS.Name="RebeccaLittle"

5>andCUSTOMERS.Customer_ID=BALANCES.Account_ID

6>go

该对话框允许用户改变当前的结算账号当你将该数据返回给数据库以后并按下OK

按钮时UPDATE语句将会运行

INPUT

1>updateBALANCESsetCurr_BAL='new-value'WHEREAccount_ID=6

2>committransaction

3>go

如果用户选择了CANCEL按钮那么将会执行ROLLBACK的语句

INPUT

1>rollbacktransaction

2>go

ROLLBACK语句将会终止整个事务当存在嵌套事务时ROLLBACK将会终止掉全

部事务系统将会返回到事务开始的最初状态

如果当前没有活动的事务时ROLLBACK或COMMIT语句将不会对数据库产生任何

SQL21日自学通(V1.0)翻译人笨猪

233

作用你可以认为这是一个无效的命令

在COMMIT语句运行以后在事务中的所有动作都会得到确认这时在使用

ROLLBACK命令就太晚了

在事务中使用保存点

在事务中使用ROLLBACK可以取消整个的事务但是你也可以在你的事务当中使用

语句进行部分地确认在Sybase和Oracle中都允许你在当前事务中设一个保存点从

这一点开始如果你使用了ROLLBACK命令那么系统将会回到保存点时的状态而在

保存点之前的语句将会得到确认在ORACLE中创建一个保存点的语法格式如下

SYNTAX

SAVEPOINTsavepoint_name;

在SYBASE中创建保存点的语法格式如下

SYNTAX

savetransactionsavepoint_name

下边是使用ORACLE语法的例子

INPUT

SQL>SETTRANSACTION

SQL>UPDATEBALANCESSETCURR_BAL=25000WHEREACCOUNT_ID=5

SQL>SAVEPOINTsave_it

SQL>DELETEFROMBALANCESWHEREACCOUNT_ID=5

SQL>ROLLBACK

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

当前位置:首页 > 表格模板 > 合同协议

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

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