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