我目前对所有表都使用带有 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/