读书笔记:《亮剑 .Net》——企业级服务COM+事务
2009-07-24 14:32
288 查看
要实现COM+事务处理的类必须继承System.EnterpriseServices.ServicedComponent,这些类需要是公共的,并且需要提供一个公共的默认的构造器。
要找需要使用COM+事务处理的类定义以前加属性[Transaction(TransactionOption.Required)],这样类中的每一个方法都会运行在一个事务中。
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的事务总是线程安全的,无让多个线程参与到同一个事务中
要找需要使用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)] |
(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的事务总是线程安全的,无让多个线程参与到同一个事务中
相关文章推荐
- 企业级服务 COM+事务
- 数据库开发之【企业级服务COM+事务】
- .NET开发中的事务处理大比拼 之 企业级服务COM+事务 (转)
- .NET开发中的事务处理大比拼 之 企业级服务COM+事务
- 做企业级服务com+事务几个注意点
- .NET开发中的事务处理大比拼 之 企业级服务COM+事务
- 读书笔记:《亮剑 .Net》——System.Transactions 事务处理
- 手把手搭建企业级服务--5.搭建Tomcat-开放8080端口
- 企业级Nginx服务基础到架构优化详解--25条 推荐
- 分布式服务的事务如何处理
- 用户VirtualServer部署Windows2003 Server、NLB和基于COM+企业服务环境实践
- Com+事务
- 关于SQL Server 2005服务无法启动,报3417错误。(附带重装SQL时解决COM+目录问题)(转帖)
- EJB---->事务管理服务
- 在 .NET 中使用 COM+ 服务
- java微服务架构的分布式事务解决方案
- RHEL5企业级Linux服务全攻略
- 打开COM+应用程序时出现8004E00F -COM+ 无法与 Microsoft 分布式事务协调程序交谈 无法查看里面的对象 解决办法
- 关于“COM+ 无法与 Microsoft 分布式事务协调程序交谈