2014-01-30 23 views
1

我有多個函數需要寫入數據庫,並且他們互相調用。到現在爲止,我一直在使用SAVEPOINT來允許嵌套事務。問題是我需要在第一個SAVEPOINT而不是默認的DEFERRED鎖上獲得一個EXCLUSIVE鎖(這是確保我以後不會被SQLITE_BUSY暫停)的鎖。因此,我想要做的事情如下:如何檢查我們是否處於SQLite事務中?

 
int foo(sqlite3 *db){ 
    unsigned char wasIn = 1; 
    if (!sqlite3_isInTransaction(db)){ 
     sqlite3_query(db, "BEGIN EXCLUSIVE TRANSACTION"); 
     wasIn = 0; 
    } 
    ...do stuff.... 
    if (!wasIn){ 
     sqlite3_query(db, "COMMIT TRANSACTION"); 
    } 
} 

任何想法如何做到這一點?

回答

3

你檢查這個功能?:

http://www.sqlite.org/c3ref/get_autocommit.html

的sqlite3_get_autocommit()接口分別返回非零或零如果 給定的數據庫連接是或不是在自動提交模式, 。自動提交模式默認開啓。自動提交模式爲 由BEGIN語句禁用。自動提交模式由 COMMIT或ROLLBACK重新啓用。

所以如果BEGIN開始,然後sqlite3_get_autocommit()將返回0

相關問題