我google到triggle和存储过程的缺点如下:
1、可移植性是存储过程和触发器最大的缺点。
2、占用服务器端太多的资源,对服务器造成很大的压力
3、不能做DDL。
4、触发器排错困难,而且数据容易造成不一致,后期维护不方便。
最后一点“触发器排错困难,而且数据容易造成不一致,后期维护不方便”,如何照成数据不一致?
关于trigger的错误处理机制,我查阅了mysql手册。以下是mysql手册的说明:
在触发程序的执行过程中,MySQL处理错误的方式如下:
· 如果BEFORE触发程序失败,不执行相应行上的操作。
· 仅当BEFORE触发程序(如果有的话)和行操作均已成功执行,才执行AFTER触发程序。
· 如果在BEFORE或AFTER触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。
· 对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。

我想:最有可能照成数据不一致的情况,就是“对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。”
trigger错误会导致非事务性表不能回滚吗?非事务性表原先就不会回滚。
难道我想错了?
欢迎高手解惑。

解决方案 »

  1.   

    没看懂你是怎么想的。1. 非事务性表无法回滚。当你的UPDATE、INSERT、DELETE语句一执行,对非事务表中的更新就立即生效。
    2. TRIIGER中,或者一个事务中,如果操作到了非事务表,则当整个事务回滚的时候,对非事务表所做的更新不会被UNDO。
      

  2.   

    trigger错误会导致非事务性表不能回滚吗?非事务性表原本就无法回滚,和触发器没有关系。触发器内部可以看做是一个事务,在非事务性表里,依次执行后,不管后面发生什么错误,不会对前面执行成功的语句造成任何影响,因为它本身就不是事务安全的。在事务表里,发生错误会自动回滚。
      

  3.   


    在非事务性表里,比如你插入A的时候,触发器再动作插入B,但是在插B之前,插A之后,停电了。那么B插入失败,A插入成功。这样就会造成用户自定义完整性失败。