数据库事务处理
2007-07-12 11:10
295 查看
.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");
}
}
}
}
相关文章推荐
- Oracle数据库事务处理和故障恢复
- 数据库中的事务处理详解SQL Server Transaction
- 数据库事务处理
- JDBC应用程序连接数据库--事务处理
- 分布式系统中数据库的事务如何处理?
- 多数据库事务处理
- 数据库的事务,范式,处理,并发控制
- 软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)
- 数据库事务处理机制
- 软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)
- JDBC:数据库事务处理
- 正好整理了一下,自己做了个连接数据库的组件,支持SQLSERVER,ACCESS,ORACLE,FoxPro,MySql,IBM DB2,DBF等数据库,并且支持事务处理
- 软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)
- SQL 和Oracle对数据库事务处理的差异性
- 数据库的事务处理必须满足ACID原则,ACID分别是指什么
- 转:有事务处理的NoSQL数据库
- PHP跨数据库事务处理
- 数据库相关(4) 事务处理
- 对数据库事务处理代码通常写法的一点改进
- 关于事务处理机制和原理、分布数据库设计架构与原理