ADO.NET两种事务处理方法

第一种是SqlTransaction类事务处理,基于.NET代码上的事务处理。详细信息访问:http://www.cnblogs.com/windows/articles/1605636.htm

优点不用说,缺点是:

 

– 事务不能跨越多个数据库连接
– 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;

namespace dotNET数据访问
{
     public  partial  class 事务处理 : System.Web.UI.Page
    {
         string conn =  " Data Source=.;Initial Catalog=test;Integrated Security=True ";
        SqlConnection con;
         protected  void Page_Load( object sender, EventArgs e)
        {

        }

         protected  void Button1_Click( object sender, EventArgs e)
        {
            
            con =  new SqlConnection(conn);
            con.Open();
             // 启动一个事务。
            SqlTransaction myTran = con.BeginTransaction();

            SqlCommand myCom =  new SqlCommand();
            myCom.Connection = con;
            myCom.Transaction = myTran;
             try
            {
                myCom.CommandText =  " insert into fenye(value) values('zz') "; // 这条没有插入数据库
                myCom.ExecuteNonQuery();
                myCom.CommandText =  " insert into fenye2(value) values('zz2') ";
                myCom.ExecuteNonQuery();
                myTran.Commit();
                Response.Write( " 成功执行!1 ");
            }
             catch (Exception Ex)
            {
                myTran.Rollback();
                 // 创建并且返回异常的错误信息
                Response.Write(Ex.ToString());
                Response.Write( " 写入数据库失败 ");
            }
             finally
            {
                con.Close();
            }
        }

         protected  void Button2_Click( object sender, EventArgs e)
        {
             using (TransactionScope tsCope =  new TransactionScope())
            {
                 using (con =  new SqlConnection(conn))
                {
                    SqlCommand cmd =  new SqlCommand( " insert into fenye(value) values('zz') ", con);
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                 using (con =  new SqlConnection(conn))
                {
                    SqlCommand cmd =  new SqlCommand( " insert into fenye2(value) values('zz2') ", con);
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                Response.Write( " 执行成功!2 ");
                tsCope.Complete();
            }
        }
    }
}

第二种事务使用TransactionScope类,用来弥补第一种事务的缺点。详细信息访问:http://www.cnblogs.com/zhangpengshou/archive/2009/07/20/1527269.html

注意使用第二种事务前,先引用System.Transactions.dll,然后命名空间引用。还要确保电脑上开启了DTC服务。开启方法访问:

http://it87.net/blog/post/2010/06/04/e69c8de58aa1e599a8c397c397c397e4b88ae79a84MSDTCe4b88de58fafe794a8e8a7a3e586b3e58a9ee6b395.aspx
内容如下:

 

 

MSDTC(分 布式交易协调器),协调跨多个数据库、消息队列、文件系统等资源管理器的事务。该服务的进程名为Msdtc.exe,该进程调用系统Microsoft Personal Web Server和Microsoft SQL Server。该服务用于管理多个服务器 .
位置:控制面板--管理工具--服务--Distributed Transaction Coordinator
依存关系:Remote Procedure Call(RPC)和Security Accounts Manager 
建议:一般家用计算机涉及不到,除非你启用Message Queuing服务,可以停止。
解决办法: 1. 在windows控制面版-->管理工具-->服务-->Distributed Transaction Coordinator-->属性-->启动
        2.在CMD下运行"net start msdtc"开启服务后正常。

注:如果在第1步Distributed Transaction Coordinator 无法启动,则是因为丢失了日志文件,重新创建日志文件,再启动就行了。重新创建 MSDTC 日志,并重新启动服务的步骤如下:
(1) 单击"开始",单击"运行",输入 cmd 后按"确定"。
(2) 输入:msdtc -resetlog (注意运行此命令时,不要执行挂起的事务)
(3) 最后输入:net start msdtc 回车,搞定!

转载于:https://www.cnblogs.com/kevin1988/p/3526629.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值