大交易的设计..
START TRANSACTION;
/*
INERT for login detail
*/
/*
INSERT for personal information
*/
/*
INSERT for user's transaction account
*/
COMMIT;
和小交易的设计..
START TRANSACTION;
/*
INSERT for login detail
*/
COMMIT;
START TRANSACTION;
/*
INSERT for personal information
*/
COMMIT;
START TRANSACTION;
/*
INSERT for user's transaction account
*/
COMMIT;
当前结果
我在我们的应用程序中都尝试过,并且通过使用“大”事务,我们在某个表中遇到了死锁。
通过使用小事务,三个事务中的一个或两个可能无法运行并导致差异。
我处理此类案例的经验不足以提供此类场景中的最佳解决方案。这里可以做出什么样的解决方案?
最佳答案
使用事务的意义在于保证存储数据的一致性。 当您进行事务时,所有的插入、更新和删除都不会立即存储在数据库中,数据库会使用暂定数据锁定表(或行,具体取决于配置),直到它到达提交命令。那时数据被写入并且锁被释放。
如果您进行“小”交易,则与根本不进行交易一样。
如果您的“大”事务被卡住了,找出导致死锁的表,以及为什么会这样。 原因有很多,包括表上的并发插入/更新/删除、未按时释放锁、以前的事务保持“事件”状态(即未到达提交命令)、DB 花费太多时间将数据存储在表上,插入之间的时间过长,违反外键等。
您可以阅读这篇文章,其中解释了事务的工作原理以及如何识别和避免死锁 http://flylib.com/books/en/1.142.1.79/1/
关于MySQL 事务 : One Large Transaction against Multiple Small Transactions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31715074/