我目前正在对所有表使用带有innodb存储引擎的mysql。
所以,我想知道这是不是一个真正的问题,是否有解决办法。
例如,我将使用数据库事务向用户收费:
一。检查他的平衡
2.减去他的余额
三。把余额记在某个地方
四。犯罪
如果更新发生在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/