2011-08-22 85 views
5

我们正在创建一个MySQL作为数据库(innodb引擎)的高度事务性系统。我们在表t1上有一个插入和更新触发器,它正在更新表t2和t3。我们已经观察到,无论何时并发用户量很大,我们都会在表t1上获得死锁。我们假设触发器发出一个表锁,直到它完成它的执行。我们在t1上放弃了触发器,并且出乎意料地没有死锁。高交易系统中的触发器

我的问题:

  1. 难道不建议在触发的高事务系统
  2. 如果没有引发什么是我们其他的选择来实现相同的逻辑。

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

欣赏任何输入。

在此先感谢。

+4

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

回答

0

您可以使用事务代替,并执行所有处理客户端。

START TRANSACTION; 

insert into t1; 
update t2; 
update t3; 

COMMIT; 

尝试,而不是使用“更新选择”和“插入选择”构建,如果你可以使用客户端提供的数据脱身。 另外InnoDB使用行锁,这比MyISAM使用的表锁更好。