2014-09-26 56 views
1

我使用SQLite數據庫和.NET的System.Data.Sqlite實現。SQLite事務和LastInsertRowID

我將循環中的記錄插入到多個表中(示例由兩個表給出)。我第一次開始一個事務,然後再插入一條記錄到表1。然後我去connection.LastInsertRowID以及與此值一起插入一條記錄(如外鍵)到表2

我這樣做是爲我所有的記錄,然後提交交易。

爲什麼這樣做會影響性能?如果由於事務尚未提交而未真正輸入記錄,那麼如何知道LastInsertRowID值?這個值是否需要每次從前面的步驟中猜出來,從而降低性能?

+0

現在無法驗證,但我懷疑它會選擇下一個數字,只是放棄數字(即在序列中留下一個空洞),如果事務回滾。 – 2014-09-26 14:21:39

+0

這是不好的?插入前在同一事務中刪除記錄會怎麼樣? – Jens 2014-09-26 14:26:39

回答

2

從您自己的數據庫連接中,您在事務中所做的所有更改都已可見。 (只有當您要回滾事務時,它們纔會消失。)

您所做的更改實際上是寫入頁面緩存中的表中。 如果頁面緩存溢出,則會將更改寫入數據庫文件(但是使用舊數據的備份以便事務可以回滾)。 有關詳細信息,請參閱Atomic Commit In SQLite

+0

我明白了。謝謝您的回答。有趣的東西:-) – Jens 2014-09-26 19:43:23