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模式,用於當前連接。
BEGIN和BEGIN WORK被作為START TRANSACTION的別名受到支持,用於對交易進行初始化。START TRANSACTION是標準的SQL語法,並且是啟動一個ad-hoc事務的推薦方法。BEGIN語句與BEGIN關鍵詞的使用不同。BEGIN關鍵詞可以啟動一個BEGIN…END複合語句。後者不會開始一項事務。請參見20.2.7節,“BEGIN … END複合語句”。
學了這一篇的文章,或許我們MySQL的能力更強了~
1 則留言