2017-07-16 40 views
0

我正在使用$db->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);开始事务。这会锁定涉及交易的表吗?MySQL - PHP事务和表锁

如果是,当涉及同时用户时会发生什么(同时发生多个事务)。

PS:我不想锁定任何表。

回答

0

BEGIN TRANSACTION上没有那种发生。它只是意味着:“开始记录我喜欢做的事情”。

当您执行COMMIT或执行ROLLBACK时,所有这些都会被执行。

如果您在该事务中有数据更改查询,如INSERT,UPDATEDELETE,则在提交期间将正常发布表锁。一开始,引擎甚至不知道你下一步要做什么,所以它实际上不能锁定任何东西。

0

当您在表格中写入时,表格始终会被锁定。这是为了保存数据库。

该事务是保存数据库中更新数据的完整过程。这用于维护数据的完整性和关系。

例如:如果一个查询失败,该过程可能会丢弃“回滚”并返回到初始状态。如果流程成功完成,则通过“提交”保留数据。

代码示例:

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); 
}