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

看板PHP作者 (MoO~)時間11年前 (2014/06/26 23:53), 編輯推噓3(306)
留言9則, 3人參與, 最新討論串3/4 (看更多)
※ 引述《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是一樣的 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.170.85.132 ※ 文章網址: http://www.ptt.cc/bbs/PHP/M.1403798029.A.CB0.html

06/27 04:23, , 1F
嗨。所以說你的意思是只能手刻mysql query cmd嗎?
06/27 04:23, 1F

06/27 04:26, , 2F
有沒有使用PDO解法...我離不開PDO ><
06/27 04:26, 2F

06/27 08:56, , 3F
疑...這不是 transaction 的標準作法吧。
06/27 08:56, 3F

06/27 09:01, , 4F
在這個情況底下必須將交易隔離層級提升到 SERIALIZABLE
06/27 09:01, 4F

06/27 09:02, , 5F
避免 phantom read 的情況發生。
06/27 09:02, 5F

06/27 09:03, , 6F
可以透過 SET TRANSACTION ISOLATION SERIALIZABLE;
06/27 09:03, 6F

06/27 09:04, , 7F
否則預設情況交易層級只有 REPEATABLE 是無法避免這個狀況
06/27 09:04, 7F

06/28 00:46, , 8F
如果是InnoDB會沒有 phantom read問題因為引擎特別有設計
06/28 00:46, 8F

06/28 00:46, , 9F
另外 row lock 得指明主鍵才有辦法執行 否則 lock 不起來
06/28 00:46, 9F
文章代碼(AID): #1Jh48Dom (PHP)
文章代碼(AID): #1Jh48Dom (PHP)