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