W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
雖然 SQLite 支持保存點(diǎn)時(shí),但 sqlite3 模塊中的一個(gè)設(shè)計(jì)缺陷使得它們幾乎無(wú)法使用。
當(dāng)啟用自動(dòng)提交時(shí),保存點(diǎn)沒(méi)有意義。當(dāng)關(guān)閉時(shí),sqlite3 會(huì)在保存點(diǎn)語(yǔ)句之前隱式提交。(事實(shí)上,它會(huì)在除了 ?SELECT
?, ?INSERT
?, ?UPDATE
?, ?DELETE
和?REPLACE
?之前的任何語(yǔ)句之前提交)這個(gè) Bug 有兩個(gè)后果:
atomic()
? 塊中。atomic()
? 。如果你正在使用 MySQL,表可能支持或不支持事務(wù);它取決于 MySQL 版本和表的類型。(表類型是指 "InnoDB" 或 "MyISAM" 之類的東西)MySQL 事務(wù)的特性超出了本文的范圍,但 MySQL 站點(diǎn)有 MySQL 事務(wù)的相關(guān)信息。
如果 MySQL 安裝時(shí)沒(méi)有支持事務(wù),然后 Django 將始終在自動(dòng)提交模式中運(yùn)行:語(yǔ)句將在它們調(diào)用的時(shí)候被執(zhí)行和提交。如果 MySQL 安裝時(shí)支持了事務(wù),Django 將像本文說(shuō)的那樣處理事務(wù)。
注解:只有在實(shí)現(xiàn)自有的事務(wù)管理時(shí),這部分才有用。這個(gè)問(wèn)題不會(huì)發(fā)生在 Django 默認(rèn)模式里,并且 ?atomic()
?會(huì)自動(dòng)處理它。
在一個(gè)事務(wù)里,當(dāng)對(duì) PostgreSQL 游標(biāo)的調(diào)用引發(fā)了異常(通常是 ??IntegrityError
??),在同一事務(wù)中的隨后的SQL 將會(huì)出現(xiàn) "?current transaction is aborted, queries ignored until end of transaction block
?" 的錯(cuò)誤 。雖然 ?save()
? 的基本用法不太可能在 PostgreSQL 中引發(fā)異常,但還有更高級(jí)的用法模式,比如保存具有唯一字段的對(duì)象,保存使用?force_insert/force_update
? 標(biāo)記,或調(diào)用自定義的 SQL。
有幾種方法來(lái)從這種錯(cuò)誤中恢復(fù)。
第一個(gè)選項(xiàng)是回滾整個(gè)事務(wù)。比如:
a.save() # Succeeds, but may be undone by transaction rollback
try:
b.save() # Could throw exception
except IntegrityError:
transaction.rollback()
c.save() # Succeeds, but a.save() may have been undone
調(diào)用 ?transaction.rollback()
? 回滾整個(gè)事務(wù)。任何未提交的數(shù)據(jù)庫(kù)操作會(huì)被丟棄。在這個(gè)例子里, ?a.save()
? 做的改變會(huì)丟失,即使操作本身沒(méi)有引發(fā)錯(cuò)誤。
你可以使用 ?savepoints
來(lái)控制回滾的程度。執(zhí)行可能失敗的數(shù)據(jù)庫(kù)操作之前,你可以設(shè)置或更新保存點(diǎn);這樣,如果操作失敗,你可以回滾單一的錯(cuò)誤操作,而不是回滾整個(gè)事務(wù)。比如:
a.save() # Succeeds, and never undone by savepoint rollback
sid = transaction.savepoint()
try:
b.save() # Could throw exception
transaction.savepoint_commit(sid)
except IntegrityError:
transaction.savepoint_rollback(sid)
c.save() # Succeeds, and a.save() is never undone
在這個(gè)例子里, ?a.save()
? 將不會(huì)在 ?b.save()
? 引發(fā)異常的情況下被撤銷。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: