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