我正在从事金融系统工作,并且遇到了MySQL事务的问题。MySQL事务回滚没有ROLLBACK查询?
该系统是一个简单的证券交易所,用户可以在其中购买和出售虚拟股票。为了保持购买和销售过程的完整性,我使用交易。 问题是,在某些情况下(我不知道它依赖于什么)一些事务回滚(或未提交),但是下一个查询被处理。
的过程如下:
- 用户希望购买的股票为1000美元
- 在订单量有4个报价为250美元
START TRANSACTION
- 对于每一个报价:
- 脚本进行UPDATE查询(将美元从一个用户转移到另一个用户,并以相反方式分享)。然后脚本将条目插入到历史记录表中。
- 用户支付费用(更新余额)。
- 对下一个报价重复5和6。
COMMIT
现在关键的部分 - 在某些情况下,从5点不保存更改,而是从6他们(我看到费已支付,但在历史上没有交易)。 在此交易中,我没有使用ROLLBACK
,并且脚本没有中断(因为在这种情况下,费用不会被支付)。
查询有没有可能回滚没有ROLLBACK
?或者MySQL可以只提交几个最新的查询而不是全部?
非常感谢您的回复。
不,交易应该始终是原子的。要么它什么都不做或什么都不做。 – Barmar
系统中的第一个漏洞是您在交易之前检查订单(仅),因此可能已更改;例如订单1可能已被使用,只剩下3个开放优惠,根据您的实际代码,第5步可能不会做任何事情,但第6步可能仍然收取费用。但这只是一个问题,只有你的概念。还有很多其他的事情你可以做错(例如使用myisam,使用错误的事务级别,不锁定选择,...),所以这里可能还有其他问题。如果你用真实的金钱/价值进行交易,你应该找一位顾问来检查你的代码。 – Solarflare
我没有在第一篇文章中写过(对不起),但是我在启动过程之前使用'SELECT FOR UPDATE'锁定行。 当我处理单个优惠时,我正在检查另外一项,如果优惠仍然存在,用户有有效余额等。 但是目前它是演示系统。 – Zachmian