我目前正在将 Mysql 与 InnoDB 存储引擎用于所有表。
所以,我想知道这是否是一个真正的问题以及是否有解决方案。
例如,我将使用数据库事务向用户收费:
1.检查他的余额
2.减去他的余额
3.将此余额记入某处
4. 提交
如果更新发生在 #1 之后、2 和 3 之前,会发生什么情况。如果用户提款或购买其他东西,导致其余额为零。这会导致失去这种平衡。据我了解,步骤 #1 只会导致共享锁,不会阻止写入等。
对此有通用的解决方案吗?
你的标签表明你明白答案是什么——锁定。关系数据库(通常)实现事务的ACID属性,这保证了数据的一致性。在实践中,出于性能原因,这些有时会被放松,但大多数数据库都提供了一些方法来实现这一目标。
在 MySQL 中,锁定机制取决于底层存储引擎。 InnoDB 提供了几个选项,这些选项在文档 https://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html.
为了实现这些锁,你基本上有两个语法选项SELECT
:
select . . . for update
select . . . lock in share mode
请注意,这些语句应该在显式事务中使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)