我正在使用$db->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);开始一个事务。这会锁定事务中涉及的表吗?
如果为Yes,则涉及并发用户(同时有多个事务)时会发生什么情况。
附言:我不想锁任何表。
发布于 2017-07-16 18:47:23
在BEGIN TRANSACTION上不会发生这样的事情。它的意思就是:“开始录制我喜欢做的事情”。
当你执行COMMIT时,所有这些都会被执行,或者如果你使用ROLLBACK,就会被丢弃。
如果在该事务中有数据更改查询,如INSERT、UPDATE或DELETE,则在提交期间将照常发布表锁。在开始的时候,引擎甚至不知道你下一步要做什么,所以它实际上不能在那个时候锁定任何东西。
发布于 2017-07-16 19:02:52
当您在表中写入时,表将始终被锁定。这是为了保存数据库。
事务是在数据库中保存或更新数据的完整过程。这用于维护数据的完整性和关系。
例如:如果one查询失败,进程可能会丢弃"rollback“并返回到初始状态。如果进程成功完成,则使用"commit“保存数据。
代码示例:
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 );
}https://stackoverflow.com/questions/45127618
复制相似问题