高度事务性系统中的触发器

发布于 2024-11-30 19:23:56 字数 322 浏览 0 评论 0原文

我们正在创建一个高度事务性的系统,使用 MySQL 作为数据库(innodb 引擎)。我们在表 t1 上有一个插入和更新触发器,它正在更新表 t2 和 t3。我们观察到,每当并发用户量很高时,表 t1 就会出现死锁。我们假设触发器正在发出表锁,直到它完成执行为止。我们在 t1 上按下了触发器,令人惊讶的是不再出现僵局。

我的问题:

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

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

感谢任何投入。

提前致谢。

We are creating a highly transactional system with MySQL as DB (innodb engine). We have one insert and update trigger on table t1 which is updating table t2 and t3. We have observed that whenever concurrent user volume is high we are getting dead-lock on table t1. We are assuming that trigger is issuing a table-lock until it's completing it's execution. We dropped the trigger on t1 and surprisingly there is no deadlock anymore.

My question:

  1. Is it not recommended to have trigger in a highly transactional system
  2. If not trigger what are our other options to implement the same logic.

Table t1 is having about 70,000 rows and increasing on a daily basis.

Appreciate any inputs.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔戏命师 2024-12-07 19:23:56

您可以使用事务来代替并在客户端进行所有处理。

START TRANSACTION;

insert into t1;
update t2;
update t3;

COMMIT;

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

You can use transactions instead and do all processing client side.

START TRANSACTION;

insert into t1;
update t2;
update t3;

COMMIT;

Try and not use 'update select' and 'insert select' constructs if you can get away with using client provided data.
Also InnoDB uses row-locking which is better than the table locking that MyISAM uses.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文