2016-06-01 101 views
0

我想實現的SQLite在我們的支持,並碰上,我得到超時和異常數據庫被鎖定在這個簡單的代碼有問題SQLite的交易失敗,.NET

try 
    lDb.ConnectionString = String.Format("Data Source={0};Version=3;Pooling=True;Max Pool Size=100;", TextBoxSqlite.Text) 
    ldb.Connection = New SQLiteConnection(ldb.ConnectionString) 
    ldb.Connection.Open() 
    lDb.Connection.BeginTransaction() 

    for lIndex As Integer = 1 To 100 
    lQuery = String.Format("INSERT INTO [TableTest] VALUES ('{0}','{1}','{2}') ", lIndex , lIndex , lIndex) 

    lCommand = New SQLiteCommand() 
    lCommand.CommandText = lQuery 
    lCommand.Connection = lDb.Connection 
    lDb.ExecuteCommand(lCommand) 
    next 

    ' if ok' 
    db.CommitTransaction() 
catch ex as exception 
    ' if failed rollback' 
    db.RollbackTransaction() 
end try 

它運行一次,在第二運行它掛起幾秒鐘並拋出異常。 第一次插入不是(正確)插入。

如果我刪除了BeginTransaction行,它就像廣告一樣工作。

我使用.NET SQlite的(System.Data.SQLite)在最新版本3.12

任何想法可能是什麼? 在此先感謝!

+0

這真的是你正在使用的實際代碼?什麼是'ldb'和'db'? –

+0

對不起,它是在更大的功能,我試圖複製粘貼/適應重要部分刪除了一些可讀性。 db是SqLiteConnection,ldb是我們使用它的包裝類。 – FKh

回答

0

documentation說:

按照以下步驟進行交易。

  1. 調用SqlConnection對象的BeginTransaction方法來標記事務的開始。
  2. [...]
  3. 執行所需的命令。
  4. 調用SqlTransaction對象的Commit方法來完成事務,或調用Rollback方法結束事務。
+0

多數民衆贊成它所做的......看到上面的代碼。提交/回滾不在代碼中可見,因爲它是不相關的(它在循環內部崩潰)。在我的代碼中,它在代碼中處於最後。 – FKh

+0

這是第一個*交易仍然是開放的。 –

+0

是的,但應該是。循環內的所有插入都應該在一個事務中。如果失敗,最終會回滾。我將編輯代碼更清晰 – FKh

0

我發現問題,所以發佈答案作爲參考。

我們的事務範圍在我們的包裝數據庫類中打開。如果我刪除了事務範圍定義,它就像廣告一樣工作。 所以錯誤是在我身邊,或者顯然事務範圍與system.data.sqlite無法正常工作(因爲它在我不嘗試啓動另一個事務時也會掛起)。