最近在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; } }
我之前在sqlserver中使用的是transactionscope,那个时候就没有问题,现在换成oracle中的时候,由于使用transactionscope会报错"无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。" ,因此我就是用的这个CommittableTransaction,现在就是无法回退数据,有谁知道这是为什么吗?是我的代码有问题还是?我应该使用什么办法来保证事务会回滚?
OracleHelper.ExecuteSqlTran(areaCode, strSqlList); 你这个执行的时候并没有与事务commitTran关联呀。
你是说
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对于我来说是不可见得啊。。。。
@羽商宫: OracleHelper我没用过,我觉得你用的OracleHelper内部应该是有封装事务的执行方法吧,我看你应该把所有需要执行的SQL都加入到strSqlList这个对象中,然后调用OracleHelper的方法来一次执行,而不是像你现在写的,分了两次执行,并且OracleHelper.ExecuteSql(strAddExamineSql.ToString(), parametersAddExamine);这个在执行时并没有绑定事务,所以是不会回滚的。