PDO 的 LastInsertID 会破坏 AWS 复制吗?

Posted

技术标签:

【中文标题】PDO 的 LastInsertID 会破坏 AWS 复制吗?【英文标题】:Will PDO's LastInsertID Break AWS Replication? 【发布时间】:2018-09-04 11:44:04 【问题描述】:

PDO lastinsertid 函数是否使用 mysqllast_insert_id 函数?

我对使用AWS 进行复制以及根据 AWS manual 使用一些 MySQL 函数中断复制特别感兴趣:

可能导致复制错误的其他常见情况包括:...使用不安全的非确定性查询

mysqlmanual 声明我使用的函数实际上并不安全:

非确定性函数不被认为是不安全的

我计划重写我的now() 用法,但我不确定如何避免last_insert_id,因为 PDO,而不是我,正在查询它。我不能单独使用select,因为insert 很可能是并行运行的,我会取回错误的 ID。

【问题讨论】:

关于PDO功能如何实现,the source is here。它使用 MySQL 驱动程序的内部函数mysql_insert_id,即reads a value already fetched during execution。所以不会触发对 MySQL 的额外调用,但我不知道复制的含义是什么。 如果您使用binlog_format=ROW 甚至MIXED,那么您将不必担心非确定性查询。阅读dev.mysql.com/doc/refman/8.0/en/replication-formats.html NOW() 即使在使用基于语句的复制时也是安全的。在此处查看“非不安全”(原文如此)函数列表:dev.mysql.com/doc/refman/8.0/en/… @BillKarwin 我在 AWS 实例中有 binlog_format=ROW, mixed。这打破了那里的复制。我在使用标准mysql实例时没有遇到过这个问题,我过去使用过mixed 【参考方案1】:

MySQL 的LAST_INSERT_ID() 函数、各种绑定(如 PDO)和底层功能是确定性的。您可以放心使用它们。

例如,这是确定性的,可以在任何地方工作。

  INSERT INTO master (address, town) VALUES('150 Broadway', 'New York');
  INSERT INTO detail (master_id, item) VALUES (LAST_INSERT_ID(), 'pepperoni pizza');

这不是。这是你被警告过的那种事情。

  INSERT INTO master (address, town) VALUES('150 Broadway', 'New York');
  SELECT @id := MAX(master_id) FROM master;   /* bad bad bad */
  INSERT INTO detail (master_id, item) VALUES (@id + 1 'pepperoni pizza');

【讨论】:

以上是关于PDO 的 LastInsertID 会破坏 AWS 复制吗?的主要内容,如果未能解决你的问题,请参考以下文章

PDO:lastInsertId 返回啥值? [复制]

pdo lastInsertId() 不断返回 0

为啥 PDO 的 Oracle 驱动程序不实现 lastInsertId()?

PDO::lastInsertID 返回 0

多线程单连接中的 PDO::lastInsertId() 是不是安全?

PDO::lastInsertID 有时不起作用