您的位置:首页 > 数据库

数据库事务处理

2007-07-12 11:10 239 查看
 

.net中事务的实现
1.直接写入Sql语句
2.使用ADO.net实现
3.COM+分布式事务处理
 直接写入SQl语句,Sql使用BeginTrans/CommitTrans/RollbackTrans 来实现,优势是所有的事务逻辑都包含在一个调用中,独立与应用程序,性能最佳.例如Sql server中的存储过程
限制是事务上下文仅存在于数据库调用中,无法获得执行结果状态信息等.数据库代码与数据库系统有关
ADO.net中有BeginTransaction方法,commit,用try,catch操作来捕获异常进行rollback,优点是简单,性能与sql方法相差不多,独立于database. 缺点是不能跨越多个数据库连接,因为事务执行在数据库连接上,所以需要在事务过程中维护一个数据库连接
sql server :连接服务器
分布式事务处理协调器DTC
com+ 事务:分布式事务
 .net framework依靠mts/com+
com+使用
microsoft distributed trasaction coordinator MDTC 操作系统级别的协调器
可以使.net应用程序跨越多系统
.net的com+事务类必须从System.EnterpriseServices.ServicedComponent类继承,该类前面需要加属性表示支持事务操作,可以在函数前加[AutoComplete]属性,表示支持自动事务处理.
DTC有一定的性能开销 DTC位于控制面板->组件服务->我的电脑下
在事务函数中可以用ContexUtil.SetAbort();ContexUtil.SetComplete();ContexUtil.EnableCommit()来进行事务的相关处理
为了使Com+文件正确运行,该组件必须有一个强文件名,需要生成一个签名文件,可以在.net命令行提示符出键入 sn.exe -k skey.snk
将.snk文件复制到你的项目文件夹中
在AssemblyInfo.cs中加入[Assembly:AssemblyKeyFileAttribute("..//..//skey.snk")]
需要注意为了使com+组建可见,需要将AssemblyInfo文件中的[assembly: ComVisible(true)],原来默认的为false,否这编译会通过,但是在client端使用时,client代码编译不会通过,会提示com+组件中的类不是共有的,可见的之类的错误
COM+实现分布式事务处理:
(1)类必须继承至System.EnterpriseServices.ServiceComponent
(2)类前必须加属性[Transaction(TransactionOption.Required)]
(3)用sn.exe -k key.snk生成密钥文件
(4)将key.snk拷入到项目文件夹
 (5)在property/AssemblyInfo.cs文件夹中加入[assembly: AssemblyKeyFileAttribute("..//..//key.snk")]
 (6)将[assembly: ComVisible(true)]设置为true
Com+组件实例:
 //class 1:提供数据库访问事务处理
using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using System.Data.SqlClient;
namespace prjEnterprise
{
    [Transaction(TransactionOption.Required)]
    [assembly: ApplicationActivation(ActivationOption.Server)]
    public class clsES : ServicedComponent
    {
        public clsES()
        {
        }
        public SqlConnection Conn;
        public void dbAccess(long nName1, long nName2, int ID1, int ID2)
        {
            try
            {
                SqlConnection Conn = new SqlConnection("server = localhost;user id = sa; password =''; database = northwind");
                Conn.Open();
                SqlCommand sqlCommand = new SqlCommand("Update Table1 set name ="+ nName1 +" where ID = "+ID1);
                sqlCommand.Connection = Conn;
                sqlCommand.ExecuteNonQuery();
                sqlCommand.CommandText = "Update Table1 set name ="+ nName2+" where ID = "+ID2;
                sqlCommand.ExecuteNonQuery();
                ContextUtil.SetComplete();
                Conn.Close();
            }
            catch (Exception e)
            {
                ContextUtil.SetAbort();
                throw e;
            }
            finally
            {
            }
        }
    }
}
 AssemblyInfo.cs修改情况
添加: [assembly: AssemblyKeyFileAttribute("..//..//snEnterprise.snk")]
修改: [assembly: ComVisible(true)]
客户端代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
namespace testES
{
    class Program
    {
        static void Main(string[] args)
        {
            prjEnterprise.clsES myTest = new prjEnterprise.clsES();
            try
            {
                myTest.dbAccess(200,50,1,2);
                Console.WriteLine("TRANSACTION ONE -- SUCCESS");
                myTest.dbAccess(70,800000000000,1,2);
                Console.WriteLine("TRANSACTION TWO -- SUCCESS");
            }
            catch (Exception e)
            {
                Console.WriteLine("TRANSACTION FAILURE");
            }
        }
    }
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息