?
Ce document utilise Manuel du site Web PHP chinois Libérer
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
回滾所有指定保存點(diǎn)建立之后執(zhí)行的命令。保存點(diǎn)仍然有效,并且需要時(shí)可以再次回滾到該點(diǎn)。
ROLLBACK TO SAVEPOINT隱含地刪除所有在該保存點(diǎn)之后建立的保存點(diǎn)。
回滾截至的保存點(diǎn)。
使用RELEASE SAVEPOINT刪除一個(gè)保存點(diǎn),而不會(huì)拋棄這個(gè)保存點(diǎn)建立之后執(zhí)行的命令結(jié)果。
聲明一個(gè)還沒(méi)有建立的保存點(diǎn)名字是一個(gè)錯(cuò)誤。
在保存點(diǎn)方面,游標(biāo)有一些非事務(wù)性的行為。任何在保存點(diǎn)里打開(kāi)的游標(biāo)都會(huì)在回滾掉這個(gè)保存點(diǎn)之后關(guān)閉。 如果一個(gè)前面打開(kāi)了的游標(biāo)在保存點(diǎn)里面, 并且游標(biāo)被一個(gè)FETCH或者MOVE command 命令影響,而這個(gè)保存點(diǎn)稍后回滾了, 那么這個(gè)游標(biāo)仍然在FETCH讓它指向的位置(也就是由FETCH引起的游標(biāo)運(yùn)動(dòng)不會(huì)被回滾)。 關(guān)閉一個(gè)游標(biāo)的行為也不會(huì)被回滾給撤消掉。 然而,游標(biāo)的查詢(xún)引發(fā)的其他副作用(如查詢(xún)調(diào)用的揮發(fā)型函數(shù)的副作用)被 被重新計(jì)算,若他們發(fā)生在一個(gè)晚于重新計(jì)算的保存點(diǎn)。 如果一個(gè)游標(biāo)的操作導(dǎo)致事務(wù)回滾,那么這個(gè)游標(biāo)就會(huì)置于不可執(zhí)行狀態(tài),所以,盡管一個(gè)事務(wù)可以用 ROLLBACK TO SAVEPOINT重新恢復(fù), 但是游標(biāo)不能再使用了。
撤銷(xiāo)my_savepoint建立之后執(zhí)行的命令的影響:
ROLLBACK TO SAVEPOINT my_savepoint;
游標(biāo)位置不受保存點(diǎn)回滾的影響:
BEGIN; DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; SAVEPOINT foo; FETCH 1 FROM foo; ?column? ---------- 1 ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo; ?column? ---------- 2 COMMIT;
SQL標(biāo)準(zhǔn)聲明關(guān)鍵字SAVEPOINT是必須的。 PostgreSQL和Oracle允許省略TRANSACTION關(guān)鍵字。 SQL只允許WORK作為ROLLBACK后面的無(wú)意義關(guān)鍵字。 還有,SQL有一個(gè)可選的AND [ NO ] CHAIN子句, 目前PostgreSQL還不支持。否則,這個(gè)命令完全兼容SQL標(biāo)準(zhǔn)。