用好数据库事务破除SQL命令单兵状态
赵玉勇

什么是数据库事务
在SQL Server的操作中,除了单个命令的执行,一个集中应用命令的要属事务,事务破除了应用命令的单兵游勇状态。事务是命令的组合,但却非几个命令的简单组合,它指作为单个逻辑工作单元执行的一系列操作,这些操作以一个整体的面貌出现,如果某一步出现问题,整个操作将全部取消,只有全部命令都执行通过,才能将本次任务完成。这样的操作有自己的优势,比如网上购物的一次交易,其付款过程至少包括以下四步数据库操作:
一、更新客户所购商品的库存信息
二、保存客户付款信息,可能包括与银行系统的交互
三、生成订单并且保存到数据库中
四、更新用户相关信息,例如购物数量等等
正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,也会出现例外,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态,库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。
数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。

创建事务的过程
创建事务主要通过下面的三条语句来完成,除了这三条语句,还要结合其他的分支控制语句等。
开始事务:Begin Transaction
此命令告知系统一个事务将要开始,这是事务开始的标志。
提交事务:Commit Transaction
事务执行结束并成功的标志,只有此命令执行完毕,才预示着一个事务内部的工作成功完成。
回滚事务:Rollback Transaction
事务不成功执行,通过此命令将取消前面命令的执行,退回到超始状态。
示例:通过标志来决定是否对某用户表users中用户序号(UID)是5的用户的密码(password)改为123456。如果标志为0不更改,标志不为0则更改。
/*--开始事务(指定事务从此处开始,后续的T-SQL语句都是一个整体)--*/
BEGIN TRANSACTION
declare @flag int /*--定义标志变量,用于是否更新的标志--*/
set @flag=1 /*--初始化变量--*/
print 'UID为用户原始密码为Password' /*--输出提示说明文字--*/
SELECT * FROM Users WHERE UID=5
print 'UID为用户更新后密码为Password'
update Users set password='123456' WHERE UID=5
SELECT * FROM Users WHERE UID=5
if @flag<>0
begin
print '事务提交,update更改了信息'
COMMIT TRANSACTION /*--提交事务--*/
SELECT * FROM Users WHERE UID=5
end
else
begin
ROLLBACK TRANSACTION /*--撤消事务,更新失效--*/
print '事务回滚,恢复到了最原始的状态,update并没有起作用'
SELECT * FROM Users WHERE UID=5
end
事务运行
"600")this.height="600";" border="0" />

上面示例在执行的过程中,根据flag标志的值决定是执行还是回滚,上图中是事务回滚后的情形,从中可以看到事务中的命令没有执行,或者说对原数据库中的内容没有影响。
小结:数据库事务具有ACID属性
企业级的数据库管理系统(DBMS)都有责任提供一种保证事务的物理完整性的机制。就常用的SQLServer2000系统而言,它具备锁定设备隔离事务、记录设备保证事务持久性等机制。事务具有下面的四大特性,即原子性、一致性、隔离性和持久性,这可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。原子性指事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性则指事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。隔离性是指由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。持久性则指事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

发表于: 2010-06-04 16:56 赵玉勇 阅读(976) 评论(0) 收藏 好文推荐

本博客所有内容,若无特殊声明,皆为博主原创作品,未经博主授权,任何人不得复制、转载、摘编等任何方式进行使用和传播。

作者该类其他博文:

发表评论(网友发言只代表个人观点,不代表本网站观点或立场。)

您尚未登录,请先【登录或注册

公告


多少IT事,尽付笑谈中crack

关于我

<2019年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

最近来访

留言簿(0)

文章分类

文章档案


最新评论

PC怎么可能过时,不过是厂商的宣传重点转到手机上去了。PC的功能和应用不是手机能代替的,有固定的市场和用户群,不会过时。
不过台式机倒是开始显出颓势,笔记本增速很快。笔记本成为主流倒是可能的。--【匿名用户】:E-works热心网友
没那么快淘汰吧--cirque
看起来像是给马云写的软文--为网游而呼吁
追求真相,这是互联网进步的意义。感谢赵老师分享!--柠檬草的味道
看来小小的输入法竞争还是激烈的。
谢谢博主分享,关注中~~--传奇
本人讨厌网络实名制久矣!--玛门
谢谢分享,关注中~~--蔡荣

阅读排行榜

评论排行榜