php - 对 php 中的 mysql 事务感到困惑

标签 php mysql transactions

如果我使用事务,它会锁定表并防止其他用户进行任何更改吗?

伪代码:

 begin transaction
   issue a select query
   issue a update query
 end transaction

那么,在这两个查询之间,是否可以通过另一个更新语句或从另一个页面发出的内容进行一些更改?

或者从事务开始,使用的表会被锁定吗?

事务和锁表有什么区别?事务会隐式锁定表吗?

编辑: 这就是我想要做的:

{
    // Check Table2 (posted messages)
    // If is_approved is FALSE for a given msg_id
    {
        // Set is_approved to TRUE
        // Update Table1 (member details) post_count_month++
        //     and post_count_lifetime++
    }
    // Else
    {
        // NOOP
    }
}

以上更新可由多个用户同时进行。此外,单个用户(管理员)可以删除一条消息(已接受和未接受的消息)。因此,对于删除,发布该消息的用户(要删除的用户)的 countmonth 和 countlifetime 应该递增,然后消息被删除。

这是我面临的两种情况。

最佳答案

事务和表锁定是解决不同问题的不同特性。在您的情况下,您似乎只对数据库执行一个写入操作,因此使用事务不会提供任何好处,除非您希望能够撤消更新。

看看 SELECT ... FOR UPDATE声明。

更新#1:

好的,这是一些代码:

START TRANSACTION;

SELECT member_id, is_approved
FROM posted_messages
WHERE msg_id=31416
FOR UPDATE;

UPDATE member_details
SET post_count_month=post_count_month+1, post_count_lifetime=post_count_lifetime+1
WHERE member_id=123;

UPDATE posted_messages
SET is_approved=TRUE
WHERE msg_id=31416;

COMMIT;

(考虑到我已经发明了所有查询,我不确定它会有多大帮助。理解代码总是比复制和粘贴更好。)

更新#2:

我已经编辑了示例代码以围绕事务中的查询。我说过事务和表锁定是不同的特性,现在仍然如此。但是,SELECT ... FOR UPDATE 在事务内部工作。这只是一个实现细节。

Locking of rows for update using SELECT FOR UPDATE only applies when autocommit is disabled (either by beginning transaction with START TRANSACTION or by setting autocommit to 0. If autocommit is enabled, the rows matching the specification are not locked.

关于php - 对 php 中的 mysql 事务感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8118749/

相关文章:

php - 如何将 JavaScript 结果转换为显示下拉列表 <option val ="value">Text</option>

php - 在 php 函数中将多个数组作为可选参数的最佳方法

php - sizeof 返回错误答案

mysql - 为表中的用户授予选择?

php - 如何在 Symfony 表单中设置下拉列表子元素的样式

php - 数据库布局权限和角色

mysql - 如何在字符串MySQL中的每个字符后插入空格

python - sqlalchemy ZopeTransactionExtension 中的查询结果错误

ios - Payway 集成到 iPhone 应用程序的教程?

java - 将@Transactional 与@Commit 一起使用时无法测试预期异常