Mysql 事务是否会暂时阻止其他更新,或者只是隐藏它们?

Mysql 事务是否会暂时阻止其他更新,或者只是隐藏它们?,mysql,transactions,Mysql,Transactions,在mysql数据库中执行事务时,他们说正在进行的事务在提交之前无法看到外部源所做的任何更新。那么这是否意味着可以进行更改,但事务将无法看到它们,或者在事务进行时实际上不可能更新数据库 因为我需要在事务进行时,其他查询不可能更改某些表的任何内容。现在,我编写了锁定所有这些表,启动原子性事务,提交,然后解锁。是这样做的吗 从我的测试来看,将隔离级别设置为SERIALIZABLE可以实现与手动表锁定和解锁相同的功能?这是否正确?这取决于您在数据库上设置的事务隔离级别。您可以阅读更多有关级别的信息。例如

在mysql数据库中执行事务时,他们说正在进行的事务在提交之前无法看到外部源所做的任何更新。那么这是否意味着可以进行更改,但事务将无法看到它们,或者在事务进行时实际上不可能更新数据库

因为我需要在事务进行时,其他查询不可能更改某些表的任何内容。现在,我编写了锁定所有这些表,启动原子性事务,提交,然后解锁。是这样做的吗


从我的测试来看,将隔离级别设置为SERIALIZABLE可以实现与手动表锁定和解锁相同的功能?这是否正确?

这取决于您在数据库上设置的事务隔离级别。您可以阅读更多有关级别的信息。例如,对于readuncommitted,您实际上可以读取其他事务未提交的行。这通常不是你想发生的事情

锁定整个表是一个非常极端的选择,除非别无选择,否则可能不应该这样做。我的建议是考虑需要锁定的行,然后可以使用SELECT更新语句锁定这些特定行。< /P> 例如,假设您有一个资源表和一个包含这些资源预订的明细表。在预订资源时,您必须检查给定资源的时间表表,以确保该资源在所需时间内可用。但是,您必须同时执行此操作,也就是说,您希望确保在检查schedules表中资源的可用性时,以及在实际将行插入schedules表时,您希望确保其他事务不会在同一时间(或重叠时间)预订资源

您可以使用“选择更新”命令来完成此操作:

select * from resources where resource_name=’a’ for update;
假设您在存储过程中执行此操作,如果其他代码为同一资源触发存储过程,它将阻塞该语句。这将确保资源不会被重复预订

我们还可以通过锁定整个资源表来实现这一点。但是,没有必要这样做,因为我们只对预订单个资源感兴趣。所以只要锁定我们关心的资源行就足够了

请注意,对于MySQL,您需要索引在for update中使用的列,否则它将锁定整个表


所有这些的要点是总是考虑最大并发性。换句话说,不要锁定超过需要的数量。否则,会使应用程序的可伸缩性大大降低,并且会抑制并发性。

谢谢您的回复。但是“假设您在存储过程中执行此操作”是什么意思呢?如果我将其作为多查询语句的第一行执行,它仍然会在该语句的后续时间内保持行锁定,对吗?即使它不在procedureYes中,它也会在事务期间保持行锁定。我假设您在代码中使用了事务。