MySQL 的锁定和并发

Locking and concurrency with MySQL

我目前正在为所有表使用 Mysql 和 InnoDB 存储引擎。

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

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

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

是否有通用的解决方案?

您的标签表明您了解答案是什么 -- 锁定。关系数据库(通常)实现事务的 ACID 属性,以确保数据的一致性。实际上,出于性能原因,这些有时会放宽,但大多数数据库都提供了一些实现此目标的方法。

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

中有描述。

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

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

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