PDO 的 LastInsertID 会破坏 AWS 复制吗?
Posted
技术标签:
【中文标题】PDO 的 LastInsertID 会破坏 AWS 复制吗?【英文标题】:Will PDO's LastInsertID Break AWS Replication? 【发布时间】:2018-09-04 11:44:04 【问题描述】:PDO lastinsertid
函数是否使用 mysql 的 last_insert_id
函数?
我对使用AWS
进行复制以及根据 AWS manual 使用一些 MySQL 函数中断复制特别感兴趣:
可能导致复制错误的其他常见情况包括:...使用不安全的非确定性查询
mysql
manual 声明我使用的函数实际上并不安全:
非确定性函数不被认为是不安全的
我计划重写我的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 的 Oracle 驱动程序不实现 lastInsertId()?