MySQL 事务 : One Large Transaction against Multiple Small Transactions

标签 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;  

当前结果

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

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

我处理此类案例的经验不足以提供此类场景中的最佳解决方案。这里可以做出什么样的解决方案?

最佳答案

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

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

如果您的“大”事务被卡住了,找出导致死锁的表,以及为什么会这样。 原因有很多,包括表上的并发插入/更新/删除、未按时释放锁、以前的事务保持“事件”状态(即未到达提交命令)、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/

相关文章:

PHP 和 MySQL 平均

php - 创建一个 php 函数来返回 mysql 结果

php - MySQL 选择具有特定条件的分组

database - 两阶段提交是否可以防止最终提交失败?

java - 如何防止 "Local transaction already has 1 non-XA Resource"异常?

java - 顺序 JDBC 语句执行不进行事务处理

php - 如何将第二个 mysql 的结果嵌套在 JSON 对象的每一行中?

c# - 无法连接到vb.net中的数据库

mysql - 对使用 UNION 或 JOIN 感到困惑

php - SELECT 多行 WHERE 匹配两个条件