事务处理

原创 2004年10月23日 18:41:00

  在编程中,经常需要使用事务。所谓事务,就是一系列必须都成功的操作,只要有一步操作失败,所有其他的步骤也必须撤销。比如用ASP开发一个网络硬盘系统,其用户注册部分要做的事有:

将用户信息记入数据库
为用户开个文件夹用于存储
初始化用户操作日志

这三步必须使用事务,否则万一磁盘操作失败,而没有撤销数据库操作,就会造成只能登陆而不能操作的“死用户”现象。
    由于数据库系统特殊的发展历史,小至Access,大到DB2,无不带有事务支持。因此上述步骤可以如下表示:
On Error Resume Next
第一步:
在事务环境下把用户信息记入数据库
If Err Then
    关闭连接
    退出
Else
    第二步:创建文件夹
    If Err Then
        回滚第一步数据库操作,退出
    Else
        第三步:在事务环境下操作日志数据库
        If Err Then
            回滚第一步操作,删除第二步建立的文件夹
            退出
        End If
    End If
End If
提交第一步数据库操作的事务
提交第二步数据库操作的事务
End


    每一步都需要进行判断,如果失败,还需要手工回滚前面多步操作,使程序变得复杂、难懂。如果今后更新了程序,增加其他步骤,还需要嵌套更多层的If...Else...End If,使程序流程更加复杂。

    正确的解决办法是使用ASP的事务控制功能。IIS通过和MTS服务联系,可以控制多种支持事务的系统,当程序发出“失败”的信号时,所有支持事务的系统均将自动回滚,即使操作已经正式完成;对不支持事务的操作也提供了方便的手工回滚方式。上面的例子用ASP事务控制功能重写如下:

<%@ TRANSACTION = Required %>
On Error Resume Next

Set Conn=Server.CreateObject("ADODB.Connection")
Conn.Open ....
Conn.Execute "INSERT...."
Conn.Close
Set Conn=Nothing

Set Conn2=Server.CreateObject("ADODB.Connection")
Conn2.Open ....
Conn2.Execute "INSERT...."
Conn2.Close
Set Conn2=Nothing

Set FSO=Server.CreateObject("Scripting.FilesystemObject")
FSO.CreateFolder "...."

If Err Then
    ObjectContext.SetAbort  '通知所有支持事务的组件回滚,并运行手工回滚代码
Else
    ObjectContext.SetComplete
End If
Set FSO=Nothing

Sub OnTransactionAbort
Response.Write "错误"
FSO.DeleteFile Server.Mappath("a.txt") 'FSO的手工回滚——删除文件夹
End Sub
Sub OnTransactionCommit
Response.Write "胜利完成任务"
End Sub
%>

    第一行的<%@ TRANSACTION = Required %>表示这一页ASP文件需要MTS的事务支持。中间的各个操作都按普通顺序书写,而不用考虑回滚问题。在程序最后判断是否有错误。如果有,调用ObjectContext的SetAbort方法,IIS会通过MTS服务通知所有支持事务的组件回滚(主要是数据库),并且运行Sub OnTransactionAbort对不支持事务的操作手工回滚;如果没有发生错误,调用ObjectContext的SetComplete方法,则会运行Sub OnTransactionCommit来显示成功的消息。
    整个ASP程序不需要为判断错误和回滚操作书写多余的代码,只须在最后进行判断,即使今后增加了多步操作,也只需要在Sub OnTransactionAbort中进行控制即可,非常方便,程序员可以专注于过程编写而不是书写纠错代码。

数据库事务处理机制

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTrans...
  • u013588712
  • u013588712
  • 2016年06月08日 16:24
  • 1908

初学JDBC(八)-JDBC的事务处理

上一篇博客讲了CallableStatement接口调用存储过程,这一篇博客我来说说JDBC的事务处理,这在以后的项目开发中也很重要,只有充分地考虑好JDBC的事务处理,才能在项目开发中遇到前台与后台...
  • u013132035
  • u013132035
  • 2016年11月22日 23:40
  • 258

MySQL事务处理实现方法步骤

需求说明:  案例背景:银行的转账过程中,发生意外是在所难免。为了避免意外而造成不必要的损失,使用事务处理的方式进行处理: A账户现有余额1000元,向余额为200的B账户进行转账500元。可能由于某...
  • hello_zhou
  • hello_zhou
  • 2016年07月09日 12:39
  • 7731

详解EBS接口开发之库存事务处理-物料批次导入

库存事务处理-物料批次导入 --系统批次表 SELECT * FROM MTL_LOT_NUMBERS T; --API创建批次 inv_lot_api_pub.create_inv_lot(x_re...
  • caixingyun
  • caixingyun
  • 2013年12月04日 23:20
  • 3099

spring事务处理详解

1:Java包含两种异常:checked异常和unchecked异常。checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获try-catch-finally,而u...
  • u013628152
  • u013628152
  • 2015年08月25日 18:02
  • 4114

Oracle EBS 物料事务处理未产生会计分录

来自:http://hi.erp100.com/home.php?mod=space&uid=218904&do=blog&id=13577369 月初,财务关会计期的时候,发现库存会计...
  • zhanzhib
  • zhanzhib
  • 2014年12月04日 16:08
  • 2469

WIP 完工事务处理Demo

DECLARE l_itface_move_rec wip_move_txn_interface%ROWTYPE; l_itface_cst_rec cst_comp_snap_in...
  • chosen1brain
  • chosen1brain
  • 2014年08月08日 10:56
  • 546

WIP 移动事务处理API Demo

DECLARE l_rec_move_txn wip_move_txn_interface%ROWTYPE; l_group_id NUMBER; l_txn_id N...
  • chosen1brain
  • chosen1brain
  • 2014年08月08日 10:49
  • 1178

关于mysql管理事务处理

前提:数据库引擎必须是InnoDB类型。 在mysql中,MyISAM和InnoDB是最常用的两种引擎,(其中MyISAM是默认引擎),其中 MyISAM 支持全文本搜索,但不支持事务;而 Inno...
  • baidu_30000217
  • baidu_30000217
  • 2015年12月21日 12:18
  • 1187

Hibernate 事务处理

事务是指由一个或者多个SQL语句组成的工作单元,这个单元中SQL语句只要有一个SQL语句执行失败,就会撤销整个工作单元。  事务的成功取决于工作单元的所有SQL语句都执行成功,它必须具备ACID...
  • jazywoo123
  • jazywoo123
  • 2012年08月08日 14:21
  • 842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:事务处理
举报原因:
原因补充:

(最多只允许输入30个字)