2013-03-26 18 views
1

我在發出SqliteConnection BeginTransaction()調用後想知道點保留鎖是否啓動並阻止寫操作?Sqlite事務 - 保留鎖何時生效

保留鎖是否對應於實際的BeginTransaction調用,還是僅在調用Commit並且事務運行後才執行?我想問一下b/c,爲了利用我現有的數據訪問層,並且不必每次都需要寫一個自定義事務來防止競爭條件,我就不想打電話給BeginTransaction(),然後調用現有選擇/插入/更新包裝的任意組合來解決手頭的問題,同時擁有獨佔寫入權限,然後最終調用Commit。爲了防止我試圖避免的競爭條件,我會要求在事務調用BeginTransaction時(即在它返回之前的某個時間),事務的保留鎖定「立即」激活。

如果需要更多的說明或細節,請告訴我,我很樂意爲您提供。非常感謝你的專業知識。

+0

這個答案在這裏:http://sqlite.phxsoftware.com/forums/p/1157/4892.aspx解決這個問題,雖然B/C缺乏任何其他文件對此,一些確認這個事實或一些有關它的更多細節會很好。繼續我上面提到的解決方案,我需要對DAL進行重大修改,因此想要充分了解鎖的工作原理,以及BeginTransaction/Commit。再次感謝。 – samosaris 2013-03-26 20:14:12

回答

2

documentation說:

對數據庫的第一次讀操作創建一個共享鎖,初次寫入創建一個RESERVED鎖。

當所有更改都符合頁面緩存時,第一次實際寫入操作將發生在COMMIT期間。

要強制的SQLite採取執行BEGIN鎖時,與BEGIN IMMEDIATE啓動事務:

後立即開始,沒有其他的數據庫連接就能寫入數據庫或做立即開始或BEGIN EXCLUSIVE。但是,其他進程可以繼續從數據庫讀取。

如果您想要防止讀取(因爲所有事務在任何情況下均正確序列化,所以不應該需要讀取),請使用BEGIN EXCLUSIVE

+0

這真是個好消息......寫完我的第一個「定製交易」(真的很醜陋)後,事情看起來很嚴峻。我肯定會測試它的一個側面的應用程序,但我沒有時間,因爲這種競爭條件已經消耗了近兩週的發展!非常感謝這寶石。 – samosaris 2013-03-26 20:36:35

+0

CL。 - 我想知道什麼隔離級別對應於事務使用的「BEGIN IMMEDIATE」? SqliteCommand方法BeginTransaction()將隔離級別作爲參數,我認爲這個值決定了事務將使用哪種鎖定模式(即,BEGIN IMMEDIATE,BEGIN EXCLUSIVE,...)。除非我在這裏丟失東西,謝謝。 ref:http://sqlite.phxsoftware.com/forums/t/1281.aspx – samosaris 2013-03-27 16:38:07

+0

SQLite的事務總是可序列化的。 – 2013-03-27 18:23:08