Re: [請益] 關於劃位系統的概念

作者: StringR (MoO~)   2014-06-26 23:53:47
※ 引述《up9cloud (九天)》之銘言:
: 一直以來
: 我都以為用PDO會自動做完transaction
: 直到看到這篇
: http://stackoverflow.com/questions/3106737/pdo-mysql-transactions-and-table-locking
: 想請教一下
: 1.除了mysql之外,哪些資料庫是可以安全使用PDO::beginTransaction
: 2.php+mysql有沒有什麼好的寫法可以參考的?
: 謝謝!
Transaction要搭配Lock才是完整的交易
beginTransaction;
SELECT xxx FROM table WHERE id=123 FOR UPDATE;
UPDATE table SET xxx = abc WHERE id=123;
COMMIT;
重點在SELECT FOR UPDATE,這會讓InnoDB把那個row鎖起來,直到你commit為止
這就避免了兩個client,先後送出query,後面的覆蓋掉前面的
你可以試試看開個console,手動操作lock後不要commit,然後再開
另外一個console做一樣的事,你會發現交易失敗了
有InnoDB,沒加上Lock,資料操作的行為就跟MyISAM是一樣的
作者: up9cloud (九天)   2014-06-27 04:23:00
嗨。所以說你的意思是只能手刻mysql query cmd嗎?有沒有使用PDO解法...我離不開PDO ><
作者: rickysu (Ricky)   2014-06-27 08:56:00
疑...這不是 transaction 的標準作法吧。在這個情況底下必須將交易隔離層級提升到 SERIALIZABLE避免 phantom read 的情況發生。可以透過 SET TRANSACTION ISOLATION SERIALIZABLE;否則預設情況交易層級只有 REPEATABLE 是無法避免這個狀況
作者: alog (A肉哥)   2014-06-28 00:46:00
如果是InnoDB會沒有 phantom read問題因為引擎特別有設計另外 row lock 得指明主鍵才有辦法執行 否則 lock 不起來

Links booklink

Contact Us: admin [ a t ] ucptt.com