将TransactionScope与Oracle结合使用 [英] using TransactionScope with Oracle

查看:163
本文介绍了将TransactionScope与Oracle结合使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Oracle odp.net进行数据访问。在使用事务范围时,我发现了以下代码,尽管这两个连接属于同一个数据库,此操作始终会提升为调用MSDTC的分布式事务。

I'm using Oracle odp.net for data access. While using transaction scope, I found the following code although the two connections are to the same database, this operation always promotes to a distributed transaction which calls the MSDTC.

 

但根据一些文章,据说oracle odp.net优化了同一数据库上的交易和操作只会被视为 本地交易,不会拨打MSDTC。

But according to some articles, it is said oracle odp.net optimizes the transactions and operations on the same database will only be treated as  local transaction, will not call the MSDTC.

 

有人能告诉我原因吗?

 

 

 

使用(TransactionScope sc = new TransactionScope() )

            {

               试试
                {



                  ;  使用(的OracleConnection C =新的OracleConnection(ConfigurationManager.ConnectionStrings [" oConn"]的ConnectionString)。)

          &NBSP ;         {

                    &NBSP ; 


                         c.Open();

                         OracleCommand oc = c.CreateCommand();



              ;           oc.CommandText = QUOT;从测试删除其中ISSUE_ID =:ISSUE_ID英寸;

                         oc.Parameters.Add(" issue_id",OracleDbType.Int32,64,ParameterDirection.Input);



                         VAR rowdelete = oc.ExecuteNonQuery();

                &NBSP ;       c.Close();
$


                     }



                &NBSP ;  使用(的OracleConnection C2 =新的OracleConnection(ConfigurationManager.ConnectionStrings [" oConn"]的ConnectionString)。)

          &NBSP ;         {

                    &NBSP ;   c2.Open();

                        的OracleCommand OC2 = c2.CreateCommand();



            &NBSP ;           oc2.CommandText = QUOT;从issue_no删除其中ISSUE_ID =:ISSUE_ID英寸;

                         oc2.Parameters.Add(" issue_id",OracleDbType.Int32,64,ParameterDirection.Input);



                         VAR rowdelete = oc2.ExecuteNonQuery();

                &NBSP ;       c2.Close();

                      


                    }



                &NBSP ;  


                    sc.Complete();&
                }
                catch(例外情况)

                {

                    throw ex;

                }
            }

using (TransactionScope sc = new TransactionScope())
            {
                try
                {

                    using (OracleConnection c = new OracleConnection(ConfigurationManager.ConnectionStrings["oConn"].ConnectionString))
                    {
                      
                        c.Open();
                        OracleCommand oc = c.CreateCommand();

                        oc.CommandText = "delete from test where issue_id=:issue_id";
                        oc.Parameters.Add("issue_id", OracleDbType.Int32, 64, ParameterDirection.Input);

                        var rowdelete = oc.ExecuteNonQuery();
                        c.Close();

                    }

                    using (OracleConnection c2 = new OracleConnection(ConfigurationManager.ConnectionStrings["oConn"].ConnectionString))
                    {
                        c2.Open();
                        OracleCommand oc2 = c2.CreateCommand();

                        oc2.CommandText = "delete from issue_no where issue_id=:issue_id";
                        oc2.Parameters.Add("issue_id", OracleDbType.Int32, 64, ParameterDirection.Input);

                        var rowdelete = oc2.ExecuteNonQuery();
                        c2.Close();
                     
                    }

                   
                    sc.Complete();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

推荐答案

你能尝试修改代码只创建一个OracleConnection对象,但仍然创建和使用两个OracleCommand对象? 然后在最后,只调用一次OracleConnection.Close()。

Can you try modifying the code to only ever create one OracleConnection object, but to still create and use two OracleCommand objects?  Then at the very end, call OracleConnection.Close() just once.


这篇关于将TransactionScope与Oracle结合使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆