事務(wù)

數(shù)據(jù)庫(kù)只有在事務(wù)中才能被更改。所有更改數(shù)據(jù)庫(kù)的命令(除SELECT以外的所有SQL命令)都會(huì)自動(dòng)開(kāi)啟一個(gè)新事務(wù),并且當(dāng)最后一個(gè)查詢完成時(shí)自動(dòng)提交。

而B(niǎo)EGIN命令可以手動(dòng)開(kāi)始事務(wù),并關(guān)閉自動(dòng)提交。當(dāng)下一條COMMIT命令執(zhí)行時(shí),自動(dòng)提交再次打開(kāi),事務(wù)中所做的更改也被寫(xiě)入數(shù)據(jù)庫(kù)。當(dāng)COMMIT失敗時(shí),自動(dòng)提交仍然關(guān)閉,以便讓用戶嘗試再次提交。若執(zhí)行的是ROLLBACK命令,則也打開(kāi)自動(dòng)提交,但不保存事務(wù)中的更改。關(guān)閉數(shù)據(jù)庫(kù)或遇到錯(cuò)誤時(shí),也會(huì)自動(dòng)回滾事務(wù)。經(jīng)常有人抱怨SQLite的插入太慢,實(shí)際上它可以做到每秒插入幾萬(wàn)次,但是每秒只能提交幾十次事務(wù)。因此在插入大批數(shù)據(jù)時(shí),可以通過(guò)禁用自動(dòng)提交來(lái)提速。

事務(wù)在改寫(xiě)數(shù)據(jù)庫(kù)文件時(shí),會(huì)先生成一個(gè)rollback journal(回滾日志),記錄初始狀態(tài)(其實(shí)就是備份),所有改動(dòng)都是在數(shù)據(jù)庫(kù)文件上進(jìn)行的。當(dāng)事務(wù)需要回滾時(shí),可以將備份文件的內(nèi)容還原到數(shù)據(jù)庫(kù)文件;提交成功時(shí),默認(rèn)的delete模式下會(huì)直接刪除這個(gè)日志。這個(gè)日志也可以幫助解決事務(wù)執(zhí)行過(guò)程中斷電,導(dǎo)致數(shù)據(jù)庫(kù)文件損壞的問(wèn)題。但如果操作系統(tǒng)或文件系統(tǒng)有bug,或是磁盤(pán)損壞,則仍有可能無(wú)法恢復(fù)。

還有一個(gè)很重要的知識(shí)點(diǎn)需要強(qiáng)調(diào):事務(wù)是和數(shù)據(jù)庫(kù)連接相關(guān)的,每個(gè)數(shù)據(jù)庫(kù)連接(使用pager來(lái))維護(hù)自己的事務(wù),且同時(shí)只能有一個(gè)事務(wù)(但是可以用SAVEPOINT來(lái)實(shí)現(xiàn)內(nèi)嵌事務(wù))。也就是說(shuō),事務(wù)與線程無(wú)關(guān),一個(gè)線程里可以同時(shí)用多個(gè)數(shù)據(jù)庫(kù)連接來(lái)完成多個(gè)事務(wù),而多個(gè)線程也可以同時(shí)(非并發(fā))使用一個(gè)數(shù)據(jù)庫(kù)連接來(lái)共同完成一個(gè)事務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容