如何在以下情况下使用事务(Remoting)?

sfanpu 2005-12-12 06:49:23
在基于Remoting的项目中,有两个方法A.a(...)和B.b(...),这两个方法(a,b)是分别属于两个分布式对象(A,B)的。要求是在A.a(...)和B.b(...)的执行中不能发生任何异常,如果发生了异常所有操作还原。这样的需求是一定要用到事务的,可是小弟我没有在分布式的环境下实现过这样的功能,还请知道的兄弟帮忙,谢谢!
...全文
202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sfanpu 2005-12-13
  • 打赏
  • 举报
回复
按照以上的方法做了,但是总是报这样的错误:System.EnterpriseServices.RegistrationException ,这是怎么回事啊?
alanzhou 2005-12-13
  • 打赏
  • 举报
回复
good!!!
charles_y 2005-12-13
  • 打赏
  • 举报
回复
Com+ 事务跟数据库没什么关系的
从EnterpriseServices.ServicedComponent继承类

namespace xxx
{
[Transaction(System.EnterpriseServices.TransactionOption.Required)]//指定事务类型
[Transaction(System.EnterpriseServices.TransactionOption.Required)]//指定事务类型
[Transaction(System.EnterpriseServices.TransactionOption.Required)]//指定事务类型
[ClassInterface(ClassInterfaceType.AutoDispatch)] //指定要生成的类的接口类型
[ObjectPooling(MinPoolSize=4, MaxPoolSize=4)] //指定对象池
public class MyBusiness : ServicedComponent {
protected override bool CanBePooled() {
return true;
}

[AutoComplete] //标记为自动完成方法
public int myProcess()
{
A.a();
B.b();
}
}

。。。。






sfanpu 2005-12-13
  • 打赏
  • 举报
回复
两位给出的好象比较偏重于数据库方面的操作,其实有很多不基于数据库方面的操作也是需要事务支持的,不知道能不能给一个更为通用的例子,谢谢!
心情解码 2005-12-13
  • 打赏
  • 举报
回复
一般的数据库事务控制要求事务里所做的操作必须在同一个数据库内,这样在出现错误的时候才能回滚(RllBack)到初始状态。这就存在一个问题,在分布式应用程序中,我们往往需要同时操作多个数据库,使用数据库本身的事务处理,很难满足程序对事务控制的要求。在COM+中,提供了完整的事务服务,我们可以利用它来完成在分布式应用程序中的事务控制。

  具体过程如下

  一:用VS.NET生成一个类库 。

  二:添加对System.EnterpristServices的引用,具体步骤

  菜单:(项目-添加引用-在.NET选项卡选择System.EnterpristServices-确定)

  三:构建类

  1:源程序

using System;
using System.EnterpriseServices;
using System.Data.SqlClient;
using System.Reflection;

namespace COMPlusSamples
{
//表明需要事务支持
[ Transaction(TransactionOption.Required) ]
//声明为服务器应用程序,还可以选择Library,表示为库应用程序
[assembly: ApplicationActivation(ActivationOption.Server)]
//描述信息
[assembly: Description("sample")]

public class TxCfgClass : ServicedComponent
{
private static string init1 = "user id=sa;password=;initial catalog=pubs;data source=(local)";

private static string init2 = "user id=sa;password=;initial catalog=NorthWind;data source=(local)";

private static string add1 = "insert into authors('au_lname','au_fname') values('test1', 'test2')";

private static string add2 = "insert into sample values('test1',22)";
//the error sql statement
//there is not table “sample”

public TxCfgClass() {}

private void ExecSQL(string init, string sql)
{
SqlConnection conn = new SqlConnection(init);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}

//添加一条记录到数据库
public void Add()
{
try
{
//在一数据库中插入一条记录

ExecSQL(init1, add1);
Console.WriteLine("the operation in the same database completely");

//在另外一个数据库中插入两条记录
//这次执行的是一个错误的SQL语句

ExecSQL(init2, add2);
Console.WriteLine("the operation in the other database
completely");

Console.WriteLine("Record(s) added, press enter...");
Console.Read();

}
catch(Exception e)
{
//事务回滚
ContextUtil.SetAbort();
Console.WriteLine("Because there are some errors in the operation ,so transcation abort");
Console.WriteLine("The error is " + e.Message);
Console.WriteLine("abort successfully");
Console.Read();
}
}
}
}
charles_y 2005-12-13
  • 打赏
  • 举报
回复
Com+ Transaction

this article may do some help

http://blog.csdn.net/charles_y/archive/2005/12/13/550833.aspx

sfanpu 2005-12-13
  • 打赏
  • 举报
回复
这也是没有办法的事啊,这样的事务对我的应用没有任何作用啊。
charles_y 2005-12-13
  • 打赏
  • 举报
回复
如果要自己在catch中写回滚,这个还有什么作用呢?


sfanpu 2005-12-13
  • 打赏
  • 举报
回复
try肯定是要用的,可能要自己在catch里写回滚了……
charles_y 2005-12-13
  • 打赏
  • 举报
回复
使用try呢?

try
{
A.a
B.b
}
。。。
sfanpu 2005-12-13
  • 打赏
  • 举报
回复
上面的问题解决了,应该是要使用强命名的原因。
但是,如果B.b()方法返回了错误的话,A.a()还是起作用了,没有达到回滚的目的。
sfanpu 2005-12-12
  • 打赏
  • 举报
回复
ding

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧