您的位置:首页 > 其它

读书笔记:《亮剑 .Net》——企业级服务COM+事务

2009-07-24 14:32 288 查看
要实现COM+事务处理的类必须继承System.EnterpriseServices.ServicedComponent,这些类需要是公共的,并且需要提供一个公共的默认的构造器。

要找需要使用COM+事务处理的类定义以前加属性[Transaction(TransactionOption.Required)],这样类中的每一个方法都会运行在一个事务中。



说明

禁用

指示 XML Web services 方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行 XML Web services 方法。

[WebMethod(TransactionOption= TransactionOption.Disabled)]

NotSupported

指示 XML Web services 方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行 XML Web services 方法。

[WebMethod(TransactionOption= TransactionOption.NotSupported)]

Supported

指示 XML Web services 方法不在事务范围内运行。当处理请求时,将在没有事务的情况下创建 XML Web services。

[WebMethod(TransactionOption= TransactionOption.Supported)]

必选

指示 XML Web services 方法需要事务。由于 XML Web services 方法只能作为根对象参与事务,因此将为 XML Web services 方法创建一个新事务。

[WebMethod(TransactionOption= TransactionOption.Required)]

RequiresNew

指示 XML Web services 方法需要新事务。当处理请求时,将在新事务内创建 XML Web services。

[WebMethod(TransactionOption= TransactionOption.RequiresNew)]

COM+事务处理有手动处理和自动处理两种方式。

(1)自动处理就是在所需要自动处理的方法钱加上[AutoComplete],根据方法的正常或抛出异常决定提交或回滚。

(2)手动处理就是调用ContextUtil对象中的EnableCommit、SetComplete和SetAbout方法。

实现步骤:

1、给程序添加强名

1)创建一对密钥

使用sn.exe执行 sn -k C:\Key.snk

其中key.snk代表将保存密钥的文件名称。

2)签名

这个文件必须在AssemblyKeyFile属性中引用,签名通常是在编译时进行的。打开工程中的AssemblyInfo.cs文件进行修改

[assembly:AssemblyKeyFile("路径\Key.snk")]

key.snk文件和项目文件必须在同一个文件夹中。

2、手动事务处理

using System.EnterpriseServices;
[Transaction(TransactionOption.Required)]
public class OrderData1 : ServicedComponent
{
//手动事务
public string WorkTran()
{
try
{
ContextUtil.EnableCommit();
Work1();
Work2();
ContextUtil.SetComplete();
return "成功!";
}
catch (Exception ex)
{
ContextUtil.SetAbort();
return "失败!";
}
}
private void Work1()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('1','test1')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
private void Work2()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('2','test2')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
}

3、自动事务处理

using System.EnterpriseServices;//企业级服务COM+事务
namespace ClassTran
{
/// <summary>
/// 自动事务
/// </summary>
[Transaction(TransactionOption.Required)]
public class OrderData2 : ServicedComponent
{
//自动事务
[AutoComplete(true)]
public string WorkTran()
{
string msg = "";
string conString = "data source=127.0.0.1;database=codematic;user id=sa;password=";
SqlConnection myConnection = new SqlConnection(conString);
myConnection.Open();
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
try
{
myCommand.CommandText = "update P_Product set Name='电脑2' where Id=52";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "update P_Product set Name='电脑3' where Id=53";
myCommand.ExecuteNonQuery();

msg ="成功!";
}
catch (Exception ex)
{
msg = "失败:"+ex.Message;
}
finally
{
myConnection.Close();
}
return msg;
}

}
}

在需要事务跨MSMQ和其他可识别事务的资源(如SQL Server数据库)运行的系统中,只能使用DTC或COM+事务。


使用COM+事务导致性能降低

使用Enterprise Services的事务总是线程安全的,无让多个线程参与到同一个事务中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: