MySQL事務(wù)處理實(shí)例講解

mysql事務(wù)處理

并非所有引擎都支持事務(wù)處理 正如第21章所述,MySQL支持幾種基本的數(shù)據(jù)庫引擎。正如本章所述,并非所有引擎都支持明確的事務(wù)處理管理。 MyISAM 和 InnoDB 是兩種最常使用的引擎。前者不支持明確的事務(wù)處理管理,而后者支持。這就是為什么本書中使用的樣例表被創(chuàng)建來使用 InnoDB 而不是更經(jīng)常使用的 MyISAM 的原因。如果你的應(yīng)用中需要事務(wù)處理功能,則一定要使用正確的引擎類型。

事務(wù)處理(transaction processing)可以用來維護(hù)數(shù)據(jù)庫的完整性,它保證成批的MySQL操作要么完全執(zhí)行,要么完全不執(zhí)行。

關(guān)系數(shù)據(jù)庫設(shè)計(jì)把數(shù)據(jù)存儲(chǔ)在多個(gè)表中,使數(shù)據(jù)更容易操縱、維護(hù)和重用。不用深究如何以及為什么進(jìn)行關(guān)系數(shù)據(jù)庫設(shè)計(jì),在某種程度上說,設(shè)計(jì)良好的數(shù)據(jù)庫模式都是關(guān)聯(lián)的。

之前使用的 orders 表就是一個(gè)很好的例子。訂單存儲(chǔ)在 orders和 orderitems 兩個(gè)表中: orders 存儲(chǔ)實(shí)際的訂單,而 orderitems 存儲(chǔ)訂購的各項(xiàng)物品。這兩個(gè)表使用稱為主鍵的唯一ID互相關(guān)聯(lián)。這兩個(gè)表又與包含客戶和產(chǎn)品信息的其他表相關(guān)聯(lián)。

給系統(tǒng)添加訂單的過程如下:

(1) 檢查數(shù)據(jù)庫中是否存在相應(yīng)的客戶(從 customers 表查詢),如果不存在,添加他/她。

(2) 檢索客戶的ID。

(3) 添加一行到 orders 表,把它與客戶ID關(guān)聯(lián)。

(4) 檢索 orders 表中賦予的新訂單ID。

(5) 對于訂購的每個(gè)物品在 orderitems 表中添加一行,通過檢索

出來的ID把它與 orders 表關(guān)聯(lián)(以及通過產(chǎn)品ID與 products 表關(guān)聯(lián))。

現(xiàn)在,假如由于某種數(shù)據(jù)庫故障(如超出磁盤空間、安全限制、表鎖等)阻止了這個(gè)過程的完成。數(shù)據(jù)庫中的數(shù)據(jù)會(huì)出現(xiàn)什么情況?

如果故障發(fā)生在添加了客戶之后, orders 表添加之前,不會(huì)有什么問題。某些客戶沒有訂單是完全合法的。在重新執(zhí)行此過程時(shí),所插入的客戶記錄將被檢索和使用??梢杂行У貜某龉收系牡胤介_始執(zhí)行此過程。

但是,如果故障發(fā)生在 orders 行添加之后, orderitems 行添加之前,怎么辦呢?現(xiàn)在,數(shù)據(jù)庫中有一個(gè)空訂單。

更糟的是,如果系統(tǒng)在添加 orderitems 行之中出現(xiàn)故障。結(jié)果是數(shù)據(jù)庫中存在不完整的訂單,而且你還不知道。

如何解決這種問題?這里就需要使用事務(wù)處理了。事務(wù)處理是一種機(jī)制,用來管理必須成批執(zhí)行的MySQL操作,以保證數(shù)據(jù)庫不包含不完

整的操作結(jié)果。利用事務(wù)處理,可以保證一組操作不會(huì)中途停止,它們或者作為整體執(zhí)行,或者完全不執(zhí)行(除非明確指示)。如果沒有錯(cuò)誤發(fā)生,整組語句提交給(寫到)數(shù)據(jù)庫表。如果發(fā)生錯(cuò)誤,則進(jìn)行回退(撤銷)以恢復(fù)數(shù)據(jù)庫到某個(gè)已知且安全的狀態(tài)。因此,請看相同的例子,這次我們說明過程如何工作。

(1) 檢查數(shù)據(jù)庫中是否存在相應(yīng)的客戶,如果不存在,添加他/她。

(2) 提交客戶信息。

(3) 檢索客戶的ID。

(4) 添加一行到 orders 表。

(5) 如果在添加行到 orders 表時(shí)出現(xiàn)故障,回退。

(6) 檢索 orders 表中賦予的新訂單ID。

(7) 對于訂購的每項(xiàng)物品,添加新行到 orderitems 表。

(8) 如果在添加新行到 orderitems 時(shí)出現(xiàn)故障,回退所有添加的orderitems 行和 orders 行。

(9) 提交訂單信息。

在使用事務(wù)和事務(wù)處理時(shí),有幾個(gè)關(guān)鍵詞匯反復(fù)出現(xiàn)。下面是關(guān)于事務(wù)處理需要知道的幾個(gè)術(shù)語:

1.事務(wù)( transaction )指一組SQL語句;

2.回退( rollback )指撤銷指定SQL語句的過程;

3.提交( commit )指將未存儲(chǔ)的SQL語句結(jié)果寫入數(shù)據(jù)庫表;

4.保留點(diǎn)( savepoint )指事務(wù)處理中設(shè)置的臨時(shí)占位符(place-holder),你可以對它發(fā)布回退(與回退整個(gè)事務(wù)處理不同)。

【相關(guān)推薦】

1. mysql免費(fèi)視頻教程

2.?mysql免費(fèi)視頻教程

3.?mysql免費(fèi)視頻教程

4.?mysql免費(fèi)視頻教程

5.?mysql免費(fèi)視頻教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊7 分享