none
伺服器無法繼續交易。描述: 3600014c6a。 此工作階段的使用中交易,已由其他工作階段認可或中止 RRS feed

  • 一般討論

  • 請問使用C# 2010寫的程式連接到資料庫時, 發生了以下錯誤訊息, 而且是不定時的持續發生

    //==================================

    伺服器無法繼續交易。描述: 3600014c6a。
    此工作階段的使用中交易,已由其他工作階段認可或中止

    //===========================

        工作平台為:Windows Server 2003      Microsoft SQL Server 2008 Express R2

    • 已變更類型 ricoisme 2012年11月19日 下午 04:20 提問者未回覆
    • 已移動 ricoisme 2012年12月10日 上午 05:40 程式問題,並非SQL Server問題 (從:資料庫管理 ( SQL Server Management ))
    2012年11月13日 上午 05:42

所有回覆

  • 請問是在SELECT還是資料異動的時候發生這個錯誤訊息呢?

    以上說明若有錯誤請指教,謝謝。
    歡迎參觀我的BLOG - 積沙成塔

    2012年11月13日 上午 08:26
  • hi

    看一下SQL Server error log或event log,裡面會有一些基本資訊

    感覺程式寫法問題比較大,你是如何使用交易的?

    交易有commit嗎?


    保證解答-微軟技術支援服務

    2012年11月13日 上午 09:56
  • 是不是被其他事务阻塞了?

    给我写信: QQ我:点击这里给我发消息

    2012年11月13日 下午 12:51
  • It's not blocking issue. Was reindex kind of job running on the server around that time?
    2012年11月13日 下午 02:14
  • 是在異動資料時發生的

    2012年11月14日 上午 12:41
  • 因為需要dbConnection去知道是否有連線, 所以dbconnection是一直連線的, 寫法如下: 有Commit及Roolback

    public override bool Exec(List<string> SQLItem, out string ErrMsg)
            {
                lock (dbConnection)
                {
                    ErrMsg = string.Empty;
                    bool Result = false;
                    try
                    {
                        if (dbConnection == null)
                        {
                            if (!ReConnectDB(out ErrMsg)) return Result;
                        }

                        if (dbConnection.State != ConnectionState.Open) dbConnection.Open();

                        //"{SQLExec} SQL Begin Transaction. --------");
                        SqlTransaction transaction = ((SqlConnection)dbConnection).BeginTransaction(IsolationLevel.ReadCommitted);
                        SqlCommand command = new SqlCommand();
                        command.Connection = (SqlConnection)dbConnection;
                        command.Transaction = transaction;

                        StringBuilder sb = new StringBuilder();
                        sb.Append("{SQLExec} SQL Command Execute :");

                        try
                        {
                            for (int i = 0; i < SQLItem.Count; i++)
                            {
                                command.CommandText = SQLItem[i];
                                int row_effect = command.ExecuteNonQuery();
                                sb.Append("\r\n    " + (i + 1).ToString("000") + ". ");
                                sb.Append("Affect Count(" + row_effect.ToString() + "), ");
                                sb.Append("SQL(\"" + SQLItem[i] + "\")");

                            }


                            transaction.Commit();
                            //"{SQLExec} SQL Commit. --------");
                            Result = true;
                        }
                        catch (SqlException ex)
                        {
                            ErrMsg = ex.Message;
                            transaction.Rollback();
                            //"{SQLExec} SQL Roolback. --------");                        
                        }
                        catch (Exception ex)
                        {
                            ErrMsg = ex.Message;
                            transaction.Rollback();
                            // "{SQLExec} SQL Roolback. --------");
                        }

                        command.Dispose();
                        command = null;

                        return Result;
                    }
                    catch (SqlException ex)
                    {
                        ErrMsg = ex.Message;
                        return Result;
                    }
                    catch (Exception ex)
                    {
                        ErrMsg = ex.Message;
                        return Result;
                    }
                }
            }

                            
    2012年11月14日 上午 12:43
  • 应该是sqlserver2008 Express版本有连接数跟事务数的限制

    我查一下资料


    给我写信: QQ我:点击这里给我发消息

    2012年11月14日 上午 02:13
  • lock的位置改了一下,你尝试一下

    try
                     {
                         if (dbConnection == null)
                         {
                             if (!ReConnectDB(out ErrMsg)) return Result;
                         }
                     lock (dbConnection)
                     {
     
                        if (dbConnection.State != ConnectionState.Open) dbConnection.Open();
     


    给我写信: QQ我:点击这里给我发消息

    2012年11月14日 上午 03:10
  • 还有尽量不要将try catch写在循环里面

    给我写信: QQ我:点击这里给我发消息

    2012年11月14日 上午 03:24
  • 感謝指教...

    來試試看此方式..

    2012年11月14日 上午 03:44
  • 拿掉lock會比較好

    lock(dbconnection )應該是造成錯誤的主因


    保證解答-微軟技術支援服務

    2012年11月14日 上午 05:18
  • 突然..有別的東西要修改..

    這兩天..才在修改DB的部份..

    修改測試完..會在回來回報..

    原本裡面有開一條Thread 定時的會去呼叫那個Exec()方法執行固定的語法, 而Exec()的方法, 又可以讓人去使用, 要把LOCK拿掉, 很怕會有同時觸發, 造成DBConnection Dead Lock的情形發生.

    是不是使用Mutex會比較好呢?

    2012年11月29日 上午 01:36
  • 目前發現是這個DLL在同一個程式 new 了兩次, 連本端的SQL Server, 但不同名稱的資料庫才會發生.

    2012年12月10日 上午 01:36
  • 感覺好像是因為引發了MSDTC,是否是因為不同的thread使用到相同的connection物件?

    可檢查一下,使用完connection就將它關閉並free掉它。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年12月10日 上午 02:36
  • 把LOCK修改掉..沒發生原本問題,,換來新的錯誤

    System.Data.SqlClient.SqlException (0x80131904): New transaction is not allowed because there are other threads running in the session.

    因為Connection一直在使用, 無法用完就關閉, 怕一直開開關關太耗資源.

    2012年12月10日 上午 03:42
  • connecting 預設有connection pool。

    可以試試看用完將它關閉Connection,是否能解決問題。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年12月10日 上午 04:43