我在using语句中有一个IDbTransaction,但我不确定如果在using语句中抛出异常,它是否会被回滚.我知道using语句会强制调用Dispose()......但是有人知道Rollback()是否也是如此?
更新:此外,我是否需要显式调用Commit(),如下所示,还是由using语句处理吗?
我的代码看起来像这样:
using Microsoft.Practices.EnterpriseLibrary.Data;
...
using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
    connection.Open();
    using(IDbTransaction transaction = connection.BeginTransaction())
    {
       //Attempt to do stuff in the database
       //potentially throw an exception
       transaction.Commit();
    }
}
我有一个庞大的INSERT INTO ...  字符串列表.目前我运行它们:
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    foreach (var commandString in sqlCommandList)
    {
        SqlCommand command = new SqlCommand(commandString, connection);
        command.ExecuteNonQuery();
    }
}
我看到每个ExecuteNonQuery()也执行提交.  
我在申请中遇到了一次错误.
这个SQLTransaction已经完成; 它不再可用
堆栈跟踪附在下面 - 它说Zombie Check和Rollback.  
代码中的错误是什么?
注意:此错误只出现一次.
UPDATE
从MSDN - SqlTransaction.Rollback方法
如果连接终止或者事务已在服务器上回滚,则Rollback会生成InvalidOperationException.
我在各种应用程序中看到此错误的最常见原因之一是,在我们的应用程序中共享 SqlConnection.
码
public int SaveUserLogOnInfo(int empID)
{
        int? sessionID = null;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlTransaction transaction = null;
            try
            {
                transaction = connection.BeginTransaction();
                sessionID = GetSessionIDForAssociate(connection, empID, transaction);
                    //Other Code
                //Commit
                transaction.Commit();
            }
            catch
            {
                //Rollback
                if (transaction != null)
                {
                    transaction.Rollback();
                    transaction.Dispose();
                    transaction = null;
                }
                //Throw exception
                throw; …