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
请注意,这些语句应在显式事务中使用。
我目前正在为所有表使用 Mysql 和 InnoDB 存储引擎。
所以,我想知道这是否是一个真正的问题,是否有解决方案。
例如,我将向使用数据库事务的用户收费: 1.查看他的余额 2.减去他的余额 3. 将此余额记入某处 4.提交
如果更新发生在#1 之后和 2 & 3 之前,会发生什么情况。如果用户取款或购买其他东西导致他的余额为零。这会导致失去平衡。据我了解,第 1 步只会导致共享锁,不会阻止写入等。
是否有通用的解决方案?
您的标签表明您了解答案是什么 -- 锁定。关系数据库(通常)实现事务的 ACID 属性,以确保数据的一致性。实际上,出于性能原因,这些有时会放宽,但大多数数据库都提供了一些实现此目标的方法。
在MySQL中,锁定机制取决于底层存储引擎。 InnoDB 提供了几个选项,在 documentation.
中有描述。要实现这些锁定,您基本上有两个语法选项 SELECT
:
select . . . for update
select . . . lock in share mode
请注意,这些语句应在显式事务中使用。