OTA*_*TAR 2 php mysql pdo transactions last-insert-id
我使用PDO交易
try {
DB::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
DB::$db->beginTransaction();
$db->prepare( insert query );
$db->execute();
$last_insert_id = $db->lastInsertId();
...
...
Run Code Online (Sandbox Code Playgroud)
此脚本需要多个并发请求.
问题:是否可能lastInsertId()为实际插入行的用户返回不正确的值?
(通过"不正确的值"我的意思是:由其他一些用户插入的id).
你安全了.你得到的ID是正确的.
PDO lastInsertId(以及last_insert_id您的PDO在此情况下委托调用的mysql )在每个连接的基础上提供最后一个自动生成的ID .
从mysql的文档:
生成的ID在每个连接的基础上在服务器中维护.这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值.此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值.此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务.
并发连接不会损害返回的id的完整性.正如您在评论中提到的,交易与此无关.只是不要忘记提交!
我还要提一下,如果你在同一个连接上运行多个语句,并且如果你的execute方法抛出一个未正确处理的异常,那么lastInsertId可以返回该连接上最后一次成功插入的id.但它永远不会从其他用户的查询返回ID.
| 归档时间: |
|
| 查看次数: |
1373 次 |
| 最近记录: |