使用MySQL在Rails中选择锁定
寻找最佳实践建议: 假设我有一个带有limit属性的Account对象.每天可以有n个付款,其金额总和达到帐户限额.创建新付款时,它会检查当天其他付款金额是否仍在帐户限额内,并保存记录或显示错误. 现在,让我们假设我的帐户限额为100美元,同时创建了两笔99美元的付款.每个人都会做一个选择,看到没有任何东西,并继续保存自己,导致总共保存198美元. 你会怎么做?我在考虑在交易开始时在支付表上发出一个写锁定,但这看起来非常严厉,因为我只是真的关心不允许属于特定账户的付款不被其他交易读取.还有其他选择,更好的处理这种情况的方法吗? 最佳答案
假设你已经在讨论交易,我假设你没有使用MyISAM,而是使用InnoDB或其他支持交易的引擎. 锁定读取或写入事务以保持操作的原子性不是应该手动完成的.这是你事务的隔离级别的工作.这也将保持事务打开和锁定表或记录之间的操作的原子性,从而同时没有读取漏洞. 对于您描述的用例,您想要的是具有’SERIALIZABLE’隔离级别的事务,它将锁定读取和写入.此外,它将自动锁定您从中读取的记录(即使您查询范围),因此可以将剩余记录留给操作. 通过’SERIALIZABLE’隔离级别,当您从表中读取信息时,任何更新或读取这些记录的尝试都必须等到该事务完成.此外,请确保在更新同一事务之前阅读,以确保使用正确的值. 您可以在此处详细了解隔离级别: 您可以在此处了解如何设置事务的隔离级别: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |