php pdo 的 lastInsertId 返回值是否可信???
test
表 DDL
create table test (
id int primary key not null auto_increment ,
name varchar(500)
)
场景
获取插入记录的ID
非事务方式
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test' , 'root' , '123456');
$stmt = $pdo->prepare("inset into test (name) values (:name)");
$stmt->execute([
':name' => 'test'
]);
// 获取刚插入记录的id
var_dump($pdo->lastInsertId());
这边我特怀疑他的正确性,毕竟用了两条语句,在第一个插入语句执行完毕后,也许在还未触发 lastInsertId
之前又有一个进程插入了一条数据,那 lastInsertId
的结果就错误了,请问是否会存在这样的现象??
事务方式
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test' , 'root' , '123456');
$pdo->beginTransacation();
try {
$stmt = $pdo->prepare("inset into test (name) values (:name)");
$stmt->execute([
':name' => 'test'
]);
// 获取刚插入记录的id
var_dump($pdo->lastInsertId());
$pdo->commit();
} catch() {
$pdo->rollBack();
}
这边能保证获取的 id
的正确性,但由于事务不能嵌套,而我有在学习 Laravel
数据库操作语句的时候,有下面这种:
\DB::transaction(function(){
\DB::table('test')->insertGetId([
':name' => 'test'
]);
});
请问这边的 isertGetId 的实现方式是??
求解惑...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
没用过
laravel
,看了下thinkphp5 的源码getLastInsID
使用的是PDO 的lastInsertId
$this->linkID
PDO 当前连接ID也就是说通过这个ID获取的自增ID是属于当前对象的最后一次插入值的ID
并不是简单的获取最后一条数据的ID。