wxwinter代码空间

兰竹菊梅★春夏秋冬☆

首页 联系 订阅 管理

接着写.....

http://community.csdn.net/Expert/topic/4995/4995184.xml?temp=.5229456里发泻了一下
心情好多了

///
ASP.NET的事物处理出现了.....................
///
写错了,应是ADO.NET的事物处理

ADO.NET操作数据库时支持事务,严格的说应是ADO.NET在连接支持事务的数据库时,支持事务

ADO.NET 在连接Access时不"直接"支持事物,因为ADO.NET操作Access时,不能像操作SQL Server那样直接

使用数据库的事务引擎
ADO.NET不是第一个可以在数据库以外使用事物的

以前有DTS,MTS,还有上面说的COM+都可以在数据库以外支持事物

数据库以外支持事物,我想描绘的就是对数据库的事物操作不放在存储过程里,而是在程序代码中实现,

先来个ADO.NET的例子

'''''''''''''''''''''我还用VB.NET写(^_^)'''''''''''''''''''''''''

      Dim 事务 As SqlTransaction                '定义变量a为事务型
      
        SqlConnection1.Open()                  'SqlConnection1对象打开连接

        事务 = SqlConnection1.BeginTransaction("okok")
        '                      '用SqlConnection1对象的BeginTransaction方法初始化[事务],
        '                      '参数okok为事务的名()
      
       SqlCommand1.Transaction = 事务

        Try  '定义一个错误处理,监视两条SQL语句的执行情况

            '指定SqlCommand对象要执行的SQL语句,并执行
            SqlCommand1.CommandText = "DELETE FROM a WHERE (a = 1)"
            SqlCommand1.ExecuteNonQuery()
            '------------------------------------------------

            '再次指定SqlCommand对象要执行的SQL语句,并执行
            SqlCommand1.CommandText = "DELETE FROM a WHERE (a = 2)"
            SqlCommand1.ExecuteNonQuery()
            '------------------------------------------------

            事务.Commit() '提交事物,既两次的SQL语句

        Catch ex As Exception  '如果两次的SQL语句有一个执行错误

            事务.Rollback("okok") '回滚事物,参数okok为要回滚的事物名.

        End Try

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

以上实现了对数据库操作的代码层事务处理,

作用与下面的方式相似
''''''''''''''''数据库中'''''''''''''''''
存储过程名
事务
DELETE FROM a WHERE (a = 1)
DELETE FROM a WHERE (a = 2)
结束事务

''''''''''''''''代码中''''''''''''''''''''''
SqlCommand1.CommandText = "存储过程名"
SqlCommand1.ExecuteNonQuery()
'''''''''''''''''''''''''''''''''''''''''
那为何要写到程序中,

其实对于上例,我强列建议写在数据库的存储过程中,而不在代码中实现

可是如果要协同操作的数据库是两个以下,比如一个是Access,一个是Sqlserver,一个是oracle,要将在这

三个数据库中的三条记录的修改放到同一个事物中完成,该如何

当然,在SQL Server的存储过程中也可以实现,

但这种操作,本人觉得还是写一个后台代码操作的中间层好一些

看一下例子
(上例中三类数据库事物协同,有点复杂,特别是还有一个内核不支持事务的Access,这个的解决下面会

提到, 这里先用三个SQL Server来举例)

 

 

三个SQL Server 当然要三个连接了

SqlConnection1
SqlConnection2
SqlConnection3

还得有三个各自独立的事务

SqlTransaction_事物1
SqlTransaction_事物2
SqlTransaction_事物3

然后分别绑定

SqlTransaction_事物1 = SqlConnection1.BeginTransaction("事物1")
SqlTransaction_事物2 = SqlConnection1.BeginTransaction("事物2")
SqlTransaction_事物3 = SqlConnection1.BeginTransaction("事物3")


还得有三个执行SQL语句的SqlCommand


SqlCommand1.Transaction = SqlTransaction_事物1
SqlCommand2.Transaction = SqlTransaction_事物2
SqlCommand3.Transaction = SqlTransaction_事物3


接下来写代码,错误扑获用并行嵌套都可,具体问题具体分析


Try 
   '对第1个数据库操作
  SqlCommand1.CommandText = "DELETE FROM a WHERE (a = 1)"
  SqlCommand1.ExecuteNonQuery()
  SqlCommand1.CommandText = "DELETE FROM a WHERE (a = 2)"
  SqlCommand1.ExecuteNonQuery()

 '对第2个数据库操作
  SqlCommand2.CommandText = "DELETE FROM a WHERE (a = 1)"
  SqlCommand2.ExecuteNonQuery()
  SqlCommand2.CommandText = "DELETE FROM a WHERE (a = 2)"
  SqlCommand2.ExecuteNonQuery()

 '对第3个数据库操作
  SqlCommand3.CommandText = "DELETE FROM a WHERE (a = 1)"
  SqlCommand3.ExecuteNonQuery()
  SqlCommand3.CommandText = "DELETE FROM a WHERE (a = 2)"
  SqlCommand4.ExecuteNonQuery()

  SqlTransaction_事物1.Commit()
  SqlTransaction_事物2.Commit()
  SqlTransaction_事物3.Commit()
Catch ex As Exception 

SqlTransaction_事物1.Rollback("事物1")
SqlTransaction_事物2.Rollback("事物2")
SqlTransaction_事物3.Rollback("事物3")

End Try


当然
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  SqlCommand1.CommandText = "DELETE FROM a WHERE (a = 1)"
  SqlCommand1.ExecuteNonQuery()
  SqlCommand1.CommandText = "DELETE FROM a WHERE (a = 2)"
  SqlCommand1.ExecuteNonQuery()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
这种操作,应该写到数据库的存储过程中,以下面这种方法操作

'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Try 
 '对第1个数据库操作
  SqlCommand1.CommandText = "存储过程"
  SqlCommand1.ExecuteNonQuery()

 '对第2个数据库操作
  SqlCommand2.CommandText = "存储过程"
  SqlCommand2.ExecuteNonQuery()

 '对第3个数据库操作
  SqlCommand2.CommandText = "存储过程"
  SqlCommand2.ExecuteNonQuery()

  SqlTransaction_事物1.Commit()
  SqlTransaction_事物2.Commit()
  SqlTransaction_事物3.Commit()
Catch ex As Exception 

SqlTransaction_事物1.Rollback("事物1")
SqlTransaction_事物2.Rollback("事物2")
SqlTransaction_事物3.Rollback("事物3")

End Try
'''''''''''''''''''''''''''''''''''''''''''''''''''''''

上面只是一个思路,至于保存点,事物嵌套,条件回滚都是ADO.NET的基本操作,这里就不多说了

我们还把话题回到System.Transactions类上

posted on 2006-09-06 19:22  wxwinter  阅读(644)  评论(0)    收藏  举报