我通过 PHP PDO 接口(interface)对 MySQL 事务进行了广泛的研究。我对交易方法的实际后台运作仍然有点模糊。具体来说,我需要知道是否有任何原因需要阻止从脚本开头到结尾的事务中的所有查询(包括 SELECT)?当然,处理事务中的任何错误并在需要时回滚它们。
我想知道事务期间是否发生任何锁定,如果是,是否是行级锁定,因为它是 InnoDB?
最佳答案
不要这样做。
这样做的原因是交易利用 MVCC一种机制,通过该机制,更新的每条数据实际上都不是就地更新,而只是插入到其他地方。
MVCC 意味着分配内存和/或存储空间来累积和操作您发送的所有更改,而不将它们提交到磁盘,直到您发出 COMMIT
。
这意味着,当整个脚本运行时,所有更改都会被存储,直到脚本结束。并且您在事务期间尝试更改的所有记录都被标记为“正在进行中”,以便其他进程/线程可以知道这些数据很快就会失效。
在整个脚本长度中将某些数据标记为“正在进行中”意味着任何其他并发更新都会看到该标志并说“我必须等到此完成,所以我将获取最新数据”。
这包括取决于隔离级别的SELECTS
。选择标记为“正在进行中”的内容可能不是您想要的,因为您可能想要加入的某些表可能包含已更新的数据,而其他表尚未更新,从而导致脏读。
操作的事务性和原子性是可取的,但成本高昂。在需要的地方使用它。是的,这意味着您需要做更多的工作来找出竞争条件可能发生的位置,即使发生竞争条件,您也必须做出决定,它们是否真的很关键,或者“某些”数据丢失/混合是否可以接受。
您是否希望您的日志、访问计数器和其他统计数据拖慢整个网站的速度?或者是该信息的质量会为了速度而牺牲(只要它不是分析套装,您就可以承受偶尔的冲突)。
您是否希望座位预订应用程序失败并允许更多用户在座位数为 0 后抢到座位?当然不是 - 在这里您希望利用事务和隔离级别来确保这种情况永远不会发生。
关于php - PDO 事务锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058070/