[EF]共享事务处理连接

不同的context对象可以通过共享连接将数据的更新操作合并在相同的事务处理范围中,参考以下的设置:

 KTStoreContext context_s = new KTStoreContext(context.Database.Connection
                            , contextOwnsConnection: false);

为了共享事务处理,因此调用另外一个版本的构造函数创建所需的context对象:除此之外,还要指定使用此连接的事务处理环境。

context_s.Database.UseTransaction(transaction.UnderlyingTransaction);

完成以上的设置。context与context_s就会同时被限制在一个事务处理范围中。

 using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        var products = context.Products;
                        foreach (Product product in products)
                        {
                            int p = (int)(product.Price * 0.5);
                            product.SPrice = p;
                        }
                        int c = context.SaveChanges();

                        KTStoreContext context_s = new KTStoreContext(context.Database.Connection
                            , contextOwnsConnection: false);
                        context_s.Database.UseTransaction(transaction.UnderlyingTransaction);
                        context_s.Database.ExecuteSqlCommand("UPDATE Product SET SPrice =0 WHERE Id=10 ");
                     
                        transaction.Commit();
                        Console.WriteLine("更新了 {0} 项数据", c);
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        Console.WriteLine("事务处理失败");
                    }
                }
展开阅读全文

Remoting /Com+的事务处理心得(共享

12-10

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

没有更多推荐了,返回首页