乖乖牌資料庫發生了人間交易慘劇

2013-04-26_112017

PID quantity
A01 300
A02 450
B03 200

有A、B兩個使用者,當A使用者執行交易(transaction)功能

BEGIN WORK

UPDATE product SET quantity = 100 WHERE PID=’A02′

COMMIT

B 使用者執行

SELECT quantity FROM product WHERE PID=’A02′

所得到的值是多少?

這是MySQL 5實力養成暨評量裡的8-56.『請參閱附圖中所顯示的資料表product作答』

答案:B

提款機的同步功能常常在很多程式語言碰到,這回在MySQL上碰到了, 對劉子來說不認識COMMIT真是一個人間慘劇啊,所以趕緊打開深入淺出SQL的限制表、視觀表、交易這一章來看。透過這樣漸漸不為人知的土法練功,希望有朝一日可以練就為MySQL大師啊。

針對解題這個部份,ㄚ琪分享如下:

TRANSACTIONS:交易。一組必須同進退的查詢;如果這些查詢法全都執行完畢、不要干擾,則不承認其中部份查詢造成的改變。

START TRANSACTIONS:這個敘述告訴RDBMS:「交易開始」。直到COMMIT執行前,改變都不具永久性。除非出現COMMIT或ROLLBACK,否則都在交易過程中;ROLLBACK可把資料庫帶回START TRANSACTION前的狀態。

當然這一章的講解很簡單,而且沒有提到BEGIN WORK,所以我們另外看一下手冊的MySQL 5.7 Reference Manual :: 13 SQL Statement Syntax :: 13.3 MySQL Transactional and Locking Statements :: 13.3.1 START TRANSACTION, COMMIT, and ROLLBACK Syntax的說明

或是簡體中文版的MySQL 5.1参考手册::13. SQL语句语法::13.4. MySQL事務處理和鎖定語句::13.4.1. START TRANSACTION, COMMIT和ROLLBACK語法

我轉譯一下語法及部份跟題意相關的部份:

START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN​​] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN​​] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}

START TRANSACTION或BEGIN語句可以開始一項新的交易COMMIT可以提交當前交易,是變更成為永久變更。ROLLBACK可以回滾當前交易,取消其變更。SET AUTOCOMMIT語句可以禁用或啟用預設的autocommit模式,用於當前連接。
BEGINBEGIN WORK被作為START TRANSACTION的別名受到支持,用於對交易進行初始化。START TRANSACTION是標準的SQL語法,並且是啟動一個ad-hoc事務的推薦方法。BEGIN語句與BEGIN關鍵詞的使用不同。BEGIN關鍵詞可以啟動一個BEGIN…END複合語句。後者不會開始一項事務。請參見20.2.7節,“BEGIN … END複合語句”

學了這一篇的文章,或許我們MySQL的能力更強了~

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *