使用 MySQL 触发器或事务?

Ek *_*mos 8 mysql innodb trigger performance transaction

我想询问您对在网站中使用 MySQL 触发器或事务的意见。

实际上我有一个payment带有 -的历史表UserId | OperationId | Comment | Credits | Sign (debit or credit)。所以每个支付操作都插入到这个表中。

但是,每次用户每次操作时,计算其总信用额度将是耗时的。所以我认为将每个用户的总信用金额保留在用户profile表中可能是一个好主意。

这是问题所在。我如何确保表中的总信用金额profile将与payment历史表中的操作保持同步?

我想使用两种方法:

  • MySQL触发器或
  • 源代码中编码的交易

哪个更靠谱?如果我有大型数据库(超过 100.000 个用户)怎么办?

你有什么建议来做到这一点吗?

BD MySQL 引擎是 InnoDB。

Rol*_*DBA 8

毫无疑问,我会排除触发器并严格遵守交易。

触发器本质上是存储过程。他们的行为几乎很难回滚。即使所有底层表都是 InnoDB,您也会遇到成比例的共享行锁和排他行锁带来的烦人的间歇性。如果触发器正在操作表,插入和更新被停滞以在每次调用触发器时执行重型 MVCC,就会出现这种情况。

将此与正确的数据验证协议未在 MySQL 的存储过程语言中实现的事实相结合。只要存储过程语言可以处理事务环境,商业智能就可以包含在数据库中。作为一名 MySQL DBA,我不得不坦率地说,MySQL 并非如此。Oracle (PL/SQL)、PostgreSQL (PL/pgSQL) 和 SQL Server (T-SQL) 在这一点上优于 MySQL。

关于事务,MySQL 将 InnoDB 作为其主要的 ACID 兼容存储引擎(MySQL 5.5 中的默认存储引擎)。它具有出色的崩溃恢复能力并遵守 ACID 合规性协议。

我每次都会选择事务而不是触发器。