php中mysql事务的困惑

php中mysql事务的困惑,php,mysql,transactions,Php,Mysql,Transactions,如果我使用事务,它会锁定表并阻止其他用户进行任何更改吗 伪代码: begin transaction issue a select query issue a update query end transaction 那么,在这两个查询之间,是否有可能通过另一个update语句或从另一个页面发出的内容进行一些更改 或者,自事务开始以来,使用的表是否会被锁定 事务和锁表之间的区别是什么?事务是否会隐式锁定表 编辑: 这就是我想做的: { // Check Table2 (

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

伪代码:

 begin transaction
   issue a select query
   issue a update query
 end transaction
那么,在这两个查询之间,是否有可能通过另一个update语句或从另一个页面发出的内容进行一些更改

或者,自事务开始以来,使用的表是否会被锁定

事务和锁表之间的区别是什么?事务是否会隐式锁定表

编辑: 这就是我想做的:

{
    // 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和countlife,然后删除该消息


这就是我面临的两种情况。

事务旨在使数据库操作原子化(或不可分割)

想象一下,如果你在做一个增量,你会遇到什么问题

首先将该值读取为1,然后将1添加到其中成为2,然后将2写回数据库

如果在添加1和回写数据库之间,其他人也这样做并读取1的值,则可能会减去1,然后回写为0。其中一个值将丢失。根据应用更新的顺序,最终结果将是2或0

(有关更多信息,请参阅)

至于在事务期间锁定表,这将取决于所使用的数据库管理系统

对于某些情况,它不会锁定表,但会在更新导致结果不一致时引发异常。强制执行所谓的“自动回滚”


对于其他dbms,它们可能使用锁来实现它。

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

请看一下这份声明

更新#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:

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

仅在以下情况下,使用“选择更新”锁定要更新的行 自动提交被禁用(通过使用START开始事务) 事务或将自动提交设置为0。如果启用了自动提交, 与规范匹配的行未锁定


首先,它取决于您用于表的存储引擎。各种mysql设置/存储引擎选项可能会发生各种奇怪的事情


例如,如果您有InnoDB表并允许脏读,这意味着其他客户端可以读取不存在的重影行,它们是不同的等等

谢谢您,如果我使用InnoDB(我相信是默认的),它支持自动锁定吗?我仍然不确定我是否完全理解事务。事务的唯一用途是在出现任何问题时回滚。对吗?对于数据库事务,您通常不需要关心dbms如何实现它。您只需要知道,如果事务成功,您的数据将是一致的。如果你真的需要知道,你可以看看这里抱歉英语不是我的第一语言。你通过提供更多的细节帮助了我很多。但我只理解其中的一些。请给我一个简单的版本(想法)这很容易理解。我正在做的是更新计数器字段。因此,当用户提交新消息时,此消息将存储在一个单独的表中。当mod或admin审核并接受它时,用户表的计数器字段将通过递增1进行更新。但如果admin阻止或删除消息,则n此计数器字段将递减1。因此,计数器字段充当容器来存储每个用户提交的邮件数。因此,有两种可能性:1.多个版主尝试接受同一用户发布的邮件(因此,版主每次接受时计数器字段将递增1)2.管理员可能正在删除或阻止某个特定用户的消息,同时,某些版主可能正在接受该特定用户的另一条消息。是的。这称为“竞争条件”。它已经过广泛的研究和讨论。你可以通过谷歌搜索找到数百万的点击率。@VppMan-我坚持:事务将允许你撤销完整的查询集,但它们不会帮助你进行并发更新。请按照我回答中的链接,阅读关于
SELECT…FOR UPDATE
@VppMan-SQL语句应该是这样的谢谢Verbeia,谢谢你纠正了我的语法错误谢谢你Bracketworks,谢谢你纠正了我的伪代码谢谢。我的主机同时允许myISAM和InnoDB。从一些评论和其他文章中,我发现InnoDB使用得更好、更广泛,并且提供了行级锁定,在mysql中是默认可用的。所以我将使用InnoDB。请他lp me.我很绝望:(当然-但你的确切问题是什么(我知道,当你不确定要使用的所有技术术语时,有时很难描述),正如我在第一篇文章(编辑条目)中提到的,我需要知道如何更新这些字段而不引起问题(并发问题)。我知道基本的sql查询和其他事情。但我不知道如何使用锁和事务进行上述更新。我重新