MySQL - PHP事务和表锁
问题描述:
我正在使用$db->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
开始事务。这会锁定涉及交易的表吗?MySQL - PHP事务和表锁
如果是,当涉及同时用户时会发生什么(同时发生多个事务)。
PS:我不想锁定任何表。
答
BEGIN TRANSACTION
上没有那种发生。它只是意味着:“开始记录我喜欢做的事情”。
当您执行COMMIT
或执行ROLLBACK
时,所有这些都会被执行。
如果您在该事务中有数据更改查询,如INSERT
,UPDATE
或DELETE
,则在提交期间将正常发布表锁。一开始,引擎甚至不知道你下一步要做什么,所以它实际上不能锁定任何东西。
答
当您在表格中写入时,表格始终会被锁定。这是为了保存数据库。
该事务是保存数据库中更新数据的完整过程。这用于维护数据的完整性和关系。
例如:如果一个查询失败,该过程可能会丢弃“回滚”并返回到初始状态。如果流程成功完成,则通过“提交”保留数据。
代码示例:
try
{
// Disable auto commit
mysqli_autocommit($db_conn, FALSE);
$query = "TRUNCATE TABLE `table`;";
if(! mysqli_query($db_conn, $query))
{
throw new \Exception("ERROR TRUNCATE: ".$query, 1);
}
foreach($data as $d)
{
$query = "INSERT INTO ....";
if(! mysqli_query($db_conn, $query))
{
throw new \Exception("ERROR INSERT: ".$query, 2);
}
}
// Success finish
mysqli_commit($db_conn);
}
catch(\Exception $e)
{
echo $e->getMessage()."\n";
echo "errno: " . mysqli_errno($db_conn) . PHP_EOL . "\n";
echo "error: " . mysqli_error($db_conn) . PHP_EOL . "\n";
// Go back to initial status
mysqli_rollback($db_conn);
}