首页 新闻 搜索 专区 学院

分布式事务为什么不会对其中的语句回退

0
悬赏园豆:50 [已解决问题] 解决于 2014-08-22 14:55

最近在oracle数据库下使用CommittableTransaction commitTran = new CommittableTransaction()这个事务,遇到了一个问题,在这个事务中要对主表和分表同时做操作,但是其中对主表的操作不会回退

具体代码如下:

public Common.Argument.RetResult AddCategoryAnayURL(string areaCode, Bill_CategoryAnay model)
        {
            Common.Argument.RetResult ret = new Common.Argument.RetResult();
            using (CommittableTransaction commitTran = new CommittableTransaction())
            {
                try
                {
                    List<TranArray> strSqlList = new List<TranArray>();                    
                    //修改IOIDCategory里的解析地址
                    string strSql = "update a" + areaCode + " set GotoURL=:GotoURL where IOIDCategory_ID=:IOIDCategory_ID";
                    OracleParameter[] parameters ={                                                                                           
                                            new OracleParameter(":GotoURL",OracleType.Number,8) ,                                          
                                            new OracleParameter(":IOIDCategory_ID",OracleType.Number,20) };
                    parameters[0].Value = model.GotoURL;
                    parameters[1].Value = model.IOIDCategory_ID;
                    strSqlList.Add(new TranArray(strSql, parameters));
                    if (model.OrderBillStatus_ID != 0)
                    {
                        
                        string strUpdateStatusSql = "update a" + areaCode + " set Status_ID=:Status_ID where IOIDCategory_ID=:IOIDCategory_ID";
                        OracleParameter[] parametersUpdateStatus ={                                                                                           
                                            new OracleParameter(":Status_ID",OracleType.Number,8) ,                                          
                                            new OracleParameter(":CategoryAnay_ID",OracleType.Number,20) };
                        parametersUpdateStatus[0].Value = status_ID;
                        parametersUpdateStatus[1].Value = model.IOIDCategory_ID;
                        strSqlList.Add(new TranArray(strUpdateStatusSql, parametersUpdateStatus));

                        //获取IOIDCategory
                        OID_IOID_Category ioidCategory = new OID_IOID_Category();
                        retModule = GetIOIDCategoryByID(areaCode, model.IOIDCategory_ID, out ioidCategory);
                        ioidCategory.Status_ID = status_ID;
                        ioidCategory.GotoURL = model.GotoURL;
                        #region 添加临时表审核条目(此处不添加待审地址)
                        StringBuilder strAddExamineSql = new StringBuilder();
                        strAddExamineSql.Append("insert into a_Temp(");//推送到临时表
                        strAddExamineSql.Append("IOIDCATEGORY_ID)");
                        strAddExamineSql.Append(" values (");
                        strAddExamineSql.Append(":IOIDCATEGORY_ID)");
                        OracleParameter[] parametersAddExamine = {
                                            new OracleParameter(":IOIDCATEGORY_ID", OracleType.Number,20)
                                            };
                        parametersAddExamine[0].Value = ioidCategory.IOIDCategory_ID;                       
                        #endregion
                        OracleHelper.ExecuteSql(strAddExamineSql.ToString(), parametersAddExamine);//这是对主数据库的操作,当分数据库的操作报错的时候,这里的操作不会回退                    

                    }
                    OracleHelper.ExecuteSqlTran(areaCode, strSqlList);//这里出错的时候,上面的对主表的操作不会回退
                    commitTran.Commit();
                }
                catch (Exception e)
                {
                    commitTran.Rollback();
                    ret.SetArgument(Common.Argument.CmdResultError.EXCEPTION, e.ToString(), "异常错误!");
                }
                return ret;
            }
        }
View Code

我之前在sqlserver中使用的是transactionscope,那个时候就没有问题,现在换成oracle中的时候,由于使用transactionscope会报错"无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。" ,因此我就是用的这个CommittableTransaction,现在就是无法回退数据,有谁知道这是为什么吗?是我的代码有问题还是?我应该使用什么办法来保证事务会回滚?

羽商宫的主页 羽商宫 | 老鸟四级 | 园豆:2493
提问于:2014-07-05 13:54
< >
分享
最佳答案
0

OracleHelper.ExecuteSqlTran(areaCode, strSqlList);   你这个执行的时候并没有与事务commitTran关联呀。

收获园豆:40
Alex_QY1987 | 小虾三级 |园豆:1888 | 2014-07-05 14:00

你是说

tx = new CommittableTransaction();

SqlConnection myConnection = new SqlConnection("server=(local)\\SQLExpress;Integrated Security=SSPI;database=northwind");
SqlCommand myCommand = new SqlCommand();

//Open the SQL connection
myConnection.Open();

//Give the transaction to SQL to enlist with
myConnection.EnlistTransaction(tx);

这里面的EnlistTransaction是吧,可是我这里使用的是oraclehelper,connection对于我来说是不可见得啊。。。。

羽商宫 | 园豆:2493 (老鸟四级) | 2014-07-05 14:05

@羽商宫: OracleHelper我没用过,我觉得你用的OracleHelper内部应该是有封装事务的执行方法吧,我看你应该把所有需要执行的SQL都加入到strSqlList这个对象中,然后调用OracleHelper的方法来一次执行,而不是像你现在写的,分了两次执行,并且OracleHelper.ExecuteSql(strAddExamineSql.ToString(), parametersAddExamine);这个在执行时并没有绑定事务,所以是不会回滚的。

Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-07-06 12:23
其他回答(1)
0
收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2014-07-07 09:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册