gpt4 book ai didi

mysql - 使用 MySQL 在 Rails 中选择锁定

转载 作者:可可西里 更新时间:2023-11-01 07:06:43 26 4
gpt4 key购买 nike

寻找最佳实践建议:

假设我有一个具有 limit 属性的 Account 对象。每天可以有 n 笔付款,其金额总和不超过帐户限额。创建新付款时,它会检查它的金额 + 当天其他付款的金额是否仍在帐户限额内,并保存记录或显示错误。

现在,假设我的账户限额为 100 美元,同时创建了两笔 99 美元的付款。每个人都会做一个选择,看到什么都没有,然后继续保存自己,结果总共保存了 198 美元。

你会怎么做?我正在考虑在交易开始时在付款表上发出写锁,但这似乎很严厉,因为我真的只关心不允许属于特定帐户的付款不被其他交易读取。有没有其他选择,更好的方法来处理这种情况?

最佳答案

I was thinking about issuing a write lock on the payments table at the start of transaction, but that seems quit eheavy-handed

假设您已经在谈论事务,我假设您没有使用 MyISAM,而是使用 InnoDB 或其他一些已经支持事务的引擎。

锁定事务的读取或写入以保持操作的原子性不应该手动完成。这是您交易的隔离级别的工作。这还将在事务打开和表或记录锁定之间保持操作的原子性,以便同时不会漏掉任何读取。

对于您描述的用例,您需要的是具有“SERIALIZABLE”隔离级别的事务,它将锁定读写。此外,它会自动仅锁定您已读取的记录(即使您查询范围),因此剩余的记录可以自由操作。

通过“SERIALIZABLE”隔离级别,当您从表中读取信息时,任何更新或读取这些记录的尝试都必须等到该事务完成。此外,请确保在更新同一笔交易之前阅读,以确保您使用的是正确的值。

您可以在此处阅读有关隔离级别的更多信息: http://en.wikipedia.org/wiki/Isolation_(database_systems) http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm

您可以在此处了解如何设置事务的隔离级别: http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

关于mysql - 使用 MySQL 在 Rails 中选择锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3502425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com