Remoting /Com+的事务处理心得(共享)
这几天一直在研究Remoting基于com+的事务处理架构,确实比较麻烦,没有现成的案例。
网上大多是零散的介绍,而且参差不齐的。现在我将自己的应用发布出来,希望大家探讨,给于建议。
1.remoting对象:
[Transaction(System.EnterpriseServices.TransactionOption.Required)]//指定事务类型
[ClassInterface(ClassInterfaceType.AutoDispatch)] //指定要生成的类的接口类型
[ObjectPooling(MinPoolSize = 4, MaxPoolSize = 10, CreationTimeout = 2000)]
public class DbServer : ServicedComponent //MarshalByRefObject
{
protected override bool CanBePooled()
{
//返回值决定了到底是直接销毁还是放到对象池中,true放到对象池,false直接销毁
return false;
}
[AutoComplete] //标记为自动完成方法 测试证明是否会滚
public void InsertData2()
{
try
{
DBOracle.ConnOracle();
string s = " insert into SERVTEST (name,id ,Code,SERVTYPE) values('test',2,'123456',2)";
DBOracle.CommandExcute(s);
Commit();
}
catch (Exception e)
{
Abort();
throw e;
}
}
public void Commit()
{
ContextUtil.SetComplete();
//只有断开才能结束一个事务
if (DBOracle.Conn != null)
DBOracle.Conn.Close();
}
public void Abort()
{
ContextUtil.SetAbort();
if (DBOracle.Conn != null)
DBOracle.Conn.Close();
}
}
关于远程对象,我有几疑惑:
1.1 :我插入一条记录后,如果再做同样的操作(执行InsertData2),结果第二次在数据库没有记录!!!
后来我显示的断开连接(DBOracle.Conn.Close();) 就好了。我总结可能是:如果不断开连接,就没有退出上次的事务,所以操作无效!
------可是只能这样退出事务吗??
1.2: 对象池的使用?这里的对象就是指DbServer 这个类实例,如果设置了对象池,是不是下次调用就不用创建对象?
1.3: 这种数据库的连接频繁的断开,连接,好不好?如果初始连接数据库,以后不不断开,这种模式好吗??
·············
客户端和服务端的代码就不帖了。
希望大家就我的3个问题给于讨论,共同学习。