那肯定的呀,你要事件肯定要在同一个连接下完成这些操作才有效。
不是长连接
你可以
open()
打开事务
执行sql1
执行sql2
执行sql3...
提交事务或回滚
Close()
这样才有效。

解决方案 »

  1.   

    事务操作,不是由你定义的,是由数据库定义的。
    /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">多条SQL语句</param>
            public static void ExecuteSqlTran(string conStr,List<String> SQLStringList)
            {
                using (OracleConnection conn = new OracleConnection(conStr))
                {
                    conn.Open();
                    OracleCommand cmd = new OracleCommand();
                    cmd.Connection = conn;
                    OracleTransaction tx = conn.BeginTransaction();
                    cmd.Transaction = tx;
                    try
                    {
                        foreach (string sql in SQLStringList)
                        {
                            if (!String.IsNullOrEmpty(sql))
                            {
                                cmd.CommandText = sql;
                                cmd.ExecuteNonQuery();
                            }
                        }
                        tx.Commit();
                    }
                    catch (System.Data.OracleClient.OracleException E)
                    {
                        tx.Rollback();
                        throw new Exception(E.Message);
                    }
                    finally
                    {
                        if (conn.State != ConnectionState.Closed)
                            {
                                conn.Close();
                            }
                    }
                }
            }       比如这里的OracleTransaction tx = conn.BeginTransaction();
    对应的MySQL和sqlserver下都有类似的定义。要有【开始事务】【-执行操作】-【提交或回滚】这一个过程。
      

  2.   

    搜索一下TransactionScope你会找到更好的实践方式
      

  3.   

    感觉应该是一个transaction只在一个connection中有效。一般系统这个也足够了。复杂的使用TransactionScope