我也很疑惑,有时 执行成功 有时失败,而且不报错。 OPERATIONFLAG 和WORKNO 都是NVarchar ID number 类型
List sqlList = new List();
sqlList.Add("update ASN_ORDER_HEADS set OPERATIONFLAG = '' where OPERATIONFLAG in (select WORKNO from ORDERS_REFORM_HEADS where ID = '" + OrderId + "') ");//大多情况执行成功
sqlList.Add("update SO_ORDER_HEADS set OPERATIONFLAG = '' where OPERATIONFLAG in (select WORKNO from ORDERS_REFORM_HEADS where ID = '" + OrderId + "') ");//大多情况执行成功
sqlList.Add("delete from ORDERS_REFORM_DETAILS where ORDERS_REFORM_HEADID = '" + OrderId + "'");//这条每次 都执行成功
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static int ExecuteSqlTran(System.Collections.Generic.List<String> SQLStringList)
{
int ret = 0;
using (SqlConnection p_Conn = new SqlConnection(CONN_STRING_NON_DTC))
{
p_Conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = p_Conn;
SqlTransaction tx = p_Conn.BeginTransaction();
cmd.Transaction = tx;
try
{
foreach (string sql in SQLStringList)
{
if (!String.IsNullOrEmpty(sql))
{
cmd.CommandText = sql;
ret += cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (Exception E)
{
tx.Rollback();
//throw new Exception(E.Message);
ret = 0;
}
finally
{
if (p_Conn.State != ConnectionState.Closed)
{
p_Conn.Close();
}
}
return ret;
}
}
程序运行过程中处于锁的状态,直到程序结束后,释放事务,数据不会被更新
这是sql语句执行的时候发现条件不符合,回滚了吧
可能是这条语句 引起的 where OPERATIONFLAG in (select WORKNO from ORDERS_REFORM_HEADS where ID = '" + OrderId + "') ,其他事务里都是给的固定ID,
就没有问题,如weixin_42381052所说,可能是orcle 认为是相同的记录,锁住了,第二条 select 语句 读取到空数据,导致没有更新。