0

我通过 PHP PDO 接口对 MySQL 事务进行了广泛的研究。我对事务方法的实际后台工作仍然有些模糊。具体来说,我需要知道是否有任何理由要阻止从脚本开头到结尾的事务中的所有查询(包括选择)?当然,处理事务中的任何错误并在需要时回滚它们。

我想知道在事务期间是否有任何锁定,如果有,是否是行级锁定,因为它是 InnoDB?

4

1 回答 1

1

不要那样做。

这样做的原因是事务利用了MVCC一种机制,通过该机制,每条更新的数据实际上都不是就地更新,而只是插入到其他地方。

MVCC 意味着分配内存和/或存储空间来累积和操作您发送的所有更改,而不会将它们提交到磁盘,直到您发出COMMIT.

这意味着当您的整个脚本运行时,所有更改都会存储到脚本结束。并且您在事务期间尝试和更改的所有记录都被标记为“正在进行中”,以便其他进程/线程可以知道这些数据很快就会失效。

在整个脚本长度中将某些数据标记为“正在进行中”意味着任何其他并发更新都会看到该标志并说“我必须等到这完成,所以我会得到最新的数据”。

这包括SELECTS取决于隔离级别。选择标记为“正在进行中”的内容可能不是您想要的,因为您可能想要加入的某些表可能包含已更新的数据,而其他表尚未更新,从而导致脏读。

操作的事务性和原子性是可取的,但代价高昂。在需要的地方使用它。是的,这意味着您需要做更多的工作来确定可能发生竞态条件的位置,即使发生竞态条件,您也必须做出决定,它们是否真的很关键,或者“某些”数据丢失/混合是否可以接受。

您是否希望您的日志、访问计数器和其他统计数据降低整个站点的速度?或者该信息的质量是否可以为速度而牺牲(只要它不是分析套装,您就可以承受偶尔的碰撞)。

您是否希望一个座位预订应用程序在座位数为 0 后仍然失败并允许更多用户抢到座位?当然不是——在这里你想利用事务和隔离级别来确保永远不会发生。

于 2012-08-21T15:57:37.430 回答