【问题标题】:Triggers in a highly Transactional System高度事务性系统中的触发器
【发布时间】:2011-11-01 03:54:12
【问题描述】:

我们正在创建一个使用 MySQL 作为 DB(innodb 引擎)的高度事务性系统。我们在表 t1 上有一个插入和更新触发器,它正在更新表 t2 和 t3。我们观察到,只要并发用户量很高,我们就会在表 t1 上陷入死锁。我们假设触发器正在发出一个表锁,直到它完成它的执行。我们在 t1 上取消了触发器,令人惊讶的是没有死锁了。

我的问题:

  1. 是否不建议在高度事务性的系统中设置触发器
  2. 如果不触发,我们还有哪些其他选项可以实现相同的逻辑。

表 t1 有大约 70,000 行,并且每天都在增加。

感谢任何输入。

提前致谢。

【问题讨论】:

  • 您没有提供足够的信息。发出SHOW ENGINE INNODB STATUS 会告诉你死锁的原因。 70k 行真的没什么,你应该做的(如果你需要帮助)是发布有问题的查询、表结构和触发器。您可以用字母替换实际的字段名称,这样就不会显示业务逻辑。

标签: mysql transactions triggers


【解决方案1】:

您可以改用事务并在客户端进行所有处理。

START TRANSACTION;

insert into t1;
update t2;
update t3;

COMMIT;

如果您可以不使用客户端提供的数据,请尝试不要使用“更新选择”和“插入选择”构造。 InnoDB 还使用行锁定,这比 MyISAM 使用的表锁定更好。

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 2012-09-22
    • 2020-05-03
    • 1970-01-01
    • 2015-02-07
    • 2021-11-26
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    相关资源
    最近更新 更多