首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL事务和表锁

MySQL事务和表锁
EN

Stack Overflow用户
提问于 2017-07-16 18:41:05
回答 2查看 530关注 0票数 1

我正在使用$db->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);开始一个事务。这会锁定事务中涉及的表吗?

如果为Yes,则涉及并发用户(同时有多个事务)时会发生什么情况。

附言:我不想锁任何表。

EN

回答 2

Stack Overflow用户

发布于 2017-07-16 18:47:23

BEGIN TRANSACTION上不会发生这样的事情。它的意思就是:“开始录制我喜欢做的事情”。

当你执行COMMIT时,所有这些都会被执行,或者如果你使用ROLLBACK,就会被丢弃。

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

票数 1
EN

Stack Overflow用户

发布于 2017-07-16 19:02:52

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

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

例如:如果one查询失败,进程可能会丢弃"rollback“并返回到初始状态。如果进程成功完成,则使用"commit“保存数据。

代码示例:

代码语言:javascript
复制
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 );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45127618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档