事務(wù)控制
mysql通過set autocommit, start transaction, commit和rollback等語句支持本地事務(wù)。
語法:
start transaction | begin [work]
commit [work] [and [no] chain] [[no] release]
rollback [work] [and [no] chain] [[no] release]
set autocommit = {0 | 1}
默認(rèn)情況下,mysql是autocommit的,如果需要通過明確的commit和rollback來提交和回滾事務(wù),那么需要通過明確的事務(wù)控制命令來開始事務(wù),這是和oracle的事務(wù)管理明顯不同的地方,如果應(yīng)用是從oracle數(shù)據(jù)庫遷移到mysql數(shù)據(jù)庫,則需要確保應(yīng)用中是否對事務(wù)進(jìn)行了明確的管理。
start transaction或begin語句可以開始一項新的事務(wù)。
commit和rollback用來提交或者回滾事務(wù)。
chain和release子句分別用來定義在事務(wù)提交或者回滾之后的操作,chain會立即啟動一個新事物,并且和剛才的事務(wù)具有相同的隔離級別,release則會斷開和客戶端的連接。
set autocommit可以修改當(dāng)前連接的提交方式,如果設(shè)置了set autocommit=0,則設(shè)置之后的所有事務(wù)都需要通過明確的命令進(jìn)行提交或者回滾。
如果我們只是對某些語句需要進(jìn)行事務(wù)控制,則使用start transaction開始一個事務(wù)比較方便,這樣事務(wù)結(jié)束之后可以自動回到自動提交的方式,如果我們希望我們所有的事務(wù)
都不是自動提交的,那么通過修改autocommit來控制事務(wù)比較方便,這樣不用在每個事務(wù)開始的時候再執(zhí)行start transaction。
因此,在同一個事務(wù)中,最好不使用不同存儲引擎的表,否則rollback時需要對非事務(wù)類型的表進(jìn)行特別的處理,因為commit、rollback只能對事務(wù)類型的表進(jìn)行提交和回滾。
通常情況下,只對提交的事務(wù)紀(jì)錄到二進(jìn)制的日志中,但是如果一個事務(wù)中包含非事務(wù)類型的表,那么回滾操作也會被記錄到二進(jìn)制日志中,以確保非事務(wù)類型表的更新可以被復(fù)制到從的數(shù)據(jù)庫中。
和oracle的事務(wù)管理相同,所有的ddl語句是不能回滾的,并且部分的ddl語句會造成隱式的提交。
在事務(wù)中可以通過定義savepoint,指定回滾事務(wù)的一個部分,但是不能指定提交事務(wù)的一個部分。對于復(fù)雜的應(yīng)用,可以定義多個不同的savepoint,滿足不同的條件時,回滾不同的 savepoint。需要注意的是,如果定義了相同名字的savepoint,則后面定義的savepoint會覆蓋之前的定義。 對于不再需要使用的savepoint,可以通過release savepoint命令刪除savepoint,刪除后的savepoint,不能再執(zhí)行rollback to savepoint命令。
下面我們例子就是模擬回滾事務(wù)的一個部分,通過定義savepoint來指定需要回滾的事務(wù)的位置。
以上就是mysql事務(wù)處理機(jī)制的使用技巧步驟的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!