mysql - MySQL 的锁定和并发

标签 mysql database transactions locking innodb

我目前对所有表都使用带有 InnoDB 存储引擎的 Mysql。

所以,我想知道这是否是一个真正的问题以及是否有解决方案。

例如,我将向使用数据库事务的用户收费: 1.检查他的余额 2.减去他的余额 3.将此余额记入某处 4.提交

如果更新发生在 #1 之后、2 和 3 之前,会发生什么情况。如果用户提款或购买其他东西,导致其余额为零。这会导致失去这种平衡。据我了解,步骤 #1 只会导致共享锁,不会阻止写入等。

有通用的解决方案吗?

最佳答案

您的标签表明您了解答案是什么——锁定。关系数据库(通常)实现事务的ACID属性,这保证了数据的一致性。在实践中,出于性能原因,这些有时会被放松,但大多数数据库都提供了一些方法来实现这一目标。

在MySQL中,锁定机制取决于底层存储引擎。 InnoDB 提供了几个选项,这些选项在 documentation 中进行了描述。 .

要实现这些锁定,基本上有两个带有 SELECT 的语法选项:

select . . . for update
select . . . lock in share mode

请注意,这些语句应该在显式事务中使用。

关于mysql - MySQL 的锁定和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32796684/

相关文章:

mysql - 在同一字段上合并两个具有不同值的 UPDATE 查询

c# - WPF MySQL 连接错误处理

ruby-on-rails - 如何实现一个基于订阅的DB,比如basecamp

java - 使用 Spring 框架以原子方式维护服务层事务和数据库日志记录

python - 如何解决 flask 中的坏键错误?

php - MySQL 中两个表的 select 查询

hibernate - Grails:执行两个修改同一个对象的连续事务的最佳方法是什么?

php - MySQL 插入语句队列

java - 从mysql中的多行中获取单列

mysql - 选择一个表中的所有行,只要该 id 不代表第二个表中的空值