PDO::beginTransaction() 是否导致 table 或行锁定直到 PDO::commit()?
Does PDO::beginTransaction() cause table or row locking until PDO::commit()?
我有一个 PHP 脚本,它使用准备好的语句在每个循环中执行大约 1,000 次插入和 1,000 次更新。只要需要完成工作,它就会一直循环,有时会持续数小时,并且会导致性能问题(包括死锁异常)。
我正在尝试提高性能并正在研究批量插入和更新(尽管我仍在尝试弄清楚如何进行批量更新)。
当调用 PDO::beginTransaction()
时,它是简单地告诉 PDO class 不要将使用 PDO::execute()
执行的查询发送到数据库,还是发送查询然后锁定在调用 PDO::commit()
之前一直使用 tables/rows?
我问的原因是 PHP 脚本每次循环最多需要 50 秒,它会在那个时间跨度内进行插入和更新查询,所以我想弄清楚我是否可以简单地在脚本开头添加 PDO::beginTransaction()
并在末尾添加 PDO::commit()
。
实际上 PDO::beginTransaction()
遵循与 MySQL 中的 START TRANSACTION
语句相同的规则,更多信息 here。
这意味着MySQL不会立即锁定table,而是会遵循ACID规则。
请注意,如果您需要显式锁定某些 table(s),您可以这样做:
$db->beginTransaction();
$db->exec('LOCK TABLES t1, t2, ...');
PDO::beginTransaction()
基本上就是autocommit mode
。当您开始一个事务($mydb->beginTransaction();
)时,这意味着您关闭 PDO AutoCommit。
而且,在您停止 Commit 或 Roll it back 之前,它永远不会停止继续进行交易。
例如 $mydb->commit();
当你停止它时,它会再次变成自动提交。
在这里,您可以通过提交或回滚来控制事务。
关于您有大量查询要处理的问题,我建议您根据优先级逐步执行,如下所示:
// start your transaction - means - stop auto commit.
If(query1 gets successful){
If(query2 gets successful)
{
// Commit the transaction // stop the transaction
}
else
{
// Roll back the transaction
}
}
else{
// Rollback the transaction
}
注意使用 PDO 事务,因为结果无法撤消。请参阅此参考:http://php.net/manual/en/pdo.transactions.php
我有一个 PHP 脚本,它使用准备好的语句在每个循环中执行大约 1,000 次插入和 1,000 次更新。只要需要完成工作,它就会一直循环,有时会持续数小时,并且会导致性能问题(包括死锁异常)。
我正在尝试提高性能并正在研究批量插入和更新(尽管我仍在尝试弄清楚如何进行批量更新)。
当调用 PDO::beginTransaction()
时,它是简单地告诉 PDO class 不要将使用 PDO::execute()
执行的查询发送到数据库,还是发送查询然后锁定在调用 PDO::commit()
之前一直使用 tables/rows?
我问的原因是 PHP 脚本每次循环最多需要 50 秒,它会在那个时间跨度内进行插入和更新查询,所以我想弄清楚我是否可以简单地在脚本开头添加 PDO::beginTransaction()
并在末尾添加 PDO::commit()
。
实际上 PDO::beginTransaction()
遵循与 MySQL 中的 START TRANSACTION
语句相同的规则,更多信息 here。
这意味着MySQL不会立即锁定table,而是会遵循ACID规则。
请注意,如果您需要显式锁定某些 table(s),您可以这样做:
$db->beginTransaction();
$db->exec('LOCK TABLES t1, t2, ...');
PDO::beginTransaction()
基本上就是autocommit mode
。当您开始一个事务($mydb->beginTransaction();
)时,这意味着您关闭 PDO AutoCommit。
而且,在您停止 Commit 或 Roll it back 之前,它永远不会停止继续进行交易。
例如 $mydb->commit();
当你停止它时,它会再次变成自动提交。
在这里,您可以通过提交或回滚来控制事务。
关于您有大量查询要处理的问题,我建议您根据优先级逐步执行,如下所示:
// start your transaction - means - stop auto commit.
If(query1 gets successful){
If(query2 gets successful)
{
// Commit the transaction // stop the transaction
}
else
{
// Roll back the transaction
}
}
else{
// Rollback the transaction
}
注意使用 PDO 事务,因为结果无法撤消。请参阅此参考:http://php.net/manual/en/pdo.transactions.php