寻找最佳实践建议:
假设我有一个带有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