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

日期: 2010-05-09 作者:赵玉勇 来源:TechTarget中国 英文

  在SQL Server的操作中,除了单个命令的执行,一个集中应用命令的要属事务,事务破除了应用命令的单兵游勇状态。事务是命令的组合,但却非几个命令的简单组合,它指作为单个逻辑工作单元执行的一系列操作,这些操作以一个整体的面貌出现,如果某一步出现问题,整个操作将全部取消,只有全部命令都执行通过,才能将本次任务完成。这样的操作有自己的优势,比如网上购物的一次交易,其付款过程至少包括以下四步数据库操作:

  一、更新客户所购商品的库存信息

  二、保存客户付款信息,可能包括与银行系统的交互

  三、生成订单并且保存到数据库中

  四、更新用户相关信息,例如购物数量等等

  正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,也会出现例外,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态,库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。

  数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。

  创建事务的过程

  创建事务主要通过下面的三条语句来完成,除了这三条语句,还要结合其他的分支控制语句等。

  开始事务:Begin Transaction

  此命令告知系统一个事务将要开始,这是事务开始的标志。

  提交事务:Commit Transaction

  事务执行结束并成功的标志,只有此命令执行完毕,才预示着一个事务内部的工作成功完成。

  回滚事务:Rollback Transaction

  事务不成功执行,通过此命令将取消前面命令的执行,退回到超始状态。

  示例:通过标志来决定是否对某用户表users中用户序号(UID)是5的用户的密码(password)改为123456。如果标志为0不更改,标志不为0则更改。

在SQL Server的操作中,除了单个命令的执行,一个集中应用命令的要属事务,事务破除了应用命令的单兵游勇状态。

  /*–开始事务(指定事务从此处开始,后续的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

  

    上面示例在执行的过程中,根据flag标志的值决定是执行还是回滚,上图中是事务回滚后的情形,从中可以看到事务中的命令没有执行,或者说对原数据库中的内容没有影响。

  小结:数据库事务具有ACID属性

  企业级的数据库管理系统(DBMS)都有责任提供一种保证事务的物理完整性的机制。就常用的SQLServer2000系统而言,它具备锁定设备隔离事务、记录设备保证事务持久性等机制。事务具有下面的四大特性,即原子性、一致性、隔离性和持久性,这可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。原子性指事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

  一致性则指事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。隔离性是指由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。持久性则指事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐