【问题标题】:MySQL Transaction: One Large Transaction against Multiple Small TransactionsMySQL 事务:一个大事务对抗多个小事务
【发布时间】:2015-07-30 04:16:11
【问题描述】:

大交易的设计..

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;  

当前结果

  • 我在我们的应用程序中都尝试过,通过使用“大”事务,我们在某个表中遇到了死锁。

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

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

【问题讨论】:

    标签: mysql sql transactions deadlock database-deadlocks


    【解决方案1】:

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

    如果您进行“小”交易,则与根本不进行交易是一样的。

    如果您的“大”事务卡住了,请找出导致死锁的表,以及它为什么会这样做。 原因有很多,包括表上的并发插入/更新/删除、锁未按时释放、以前的事务保持“活动”(即未到达提交命令)、数据库花费太多时间将数据存储在表上,插入之间的时间过长、外键违规等。

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

    【讨论】:

    • 好吧,鉴于此案的信息有限以及提出的非特定问题,我会尽力提供帮助,哈哈
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多