MySQL事务:一个大事务对多个小事务

7

The design for the Big Transaction..

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;  

当前结果

  • 我们在应用程序中尝试使用“大型”事务和使用某个表格时遇到了死锁问题。

  • 使用小型事务的话,三个事务中可能有一两个不会运行,导致不一致性。

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

2个回答

4
使用事务的目的是确保存储的数据一致性。当您进行事务时,所有的插入、更新和删除操作都不会立即存储在数据库中,数据库会锁定表格(或行,具体取决于配置)以暂存数据,直到达到提交命令。此时,数据将被写入且锁将被释放。
如果您进行“小”事务,则与不进行事务相同。
如果您的“大”事务卡住了,请查找哪个表格导致死锁以及它为什么这样做。有许多原因,包括在表格上并发插入/更新/删除、锁定未能及时释放、之前的事务仍然“活着”(即未达到提交命令)、数据库花费太多时间将数据存储在表格中、插入之间时间过长、外键违反等。
您可以阅读本文章,了解事务的工作方式以及如何识别和避免死锁:http://flylib.com/books/en/1.142.1.79/1/

嗯,考虑到案例信息有限且问题描述不够具体,我正在尽力提供帮助,哈哈。 - El Gucs

2

在我的工作经验中,我想出了这个解决方案...因为受影响模块的数据在成功或失败时都是完好无损的。感谢大家的帮助。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接