MySQL事务:针对多个小事务的一次大型事务

时间:2015-07-30 04:16:11

标签: mysql sql transactions deadlock database-deadlocks

大交易的设计..

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;  

当前结果

  • 我在我们的应用程序中尝试了两种方法,并且通过使用'Big'事务,我们在某个表中遇到了死锁。

  • 通过使用小型交易,三个中的一个或两个可能无法运行并导致差异。

我在处理此类案例方面的经验不足以在这种情况下提供最佳解决方案。这里可以提出什么样的解决方案?

2 个答案:

答案 0 :(得分:2)

使用事务的目的是确保存储数据的一致性。 当您进行事务时,所有插入,更新和删除都不会立即存储在数据库中,数据库会使用临时数据锁定表(或根据配置的行),直到它到达commit命令。此时,数据被写入并释放锁。

如果你制作"小"然后交易与完全没有交易一样。

如果你的"大"事务陷入困境,找到导致死锁的表,以及它为什么这样做。 有许多原因,包括表上的并发插入/更新/删除,锁未按时发布,以前的事务保持" alive" (即没有达到提交命令),DB花了太多时间将数据存储在表上,插入之间的时间太长,外键违规等等。

您可以阅读本文,该文章解释了事务如何工作以及如何识别和避免死锁 http://flylib.com/books/en/1.142.1.79/1/

答案 1 :(得分:0)

经过几年的工作经验,我提出了这个解决方案..因为受影响的模块的数据通过成功或失败都是完整的。谢谢大家的帮助

START TRANSACTION;
    /*
        INSERT for login detail
    */
    /*
        INSERT for personal information
    */
    /*
        INSERT for user's transaction account
    */
COMMIT;