当前位置:  开发笔记 > 后端 > 正文

我需要一个类比:触发器和事件

如何解决《我需要一个类比:触发器和事件》经验,为你挑选了1个好方法。

对于另一个问题,我偶尔会遇到一种误解,似乎在这里出现.一些提问者似乎认为触发器属于数据库,因为事件属于OOP.

有没有人有一个很好的类比来解释为什么这是一个有缺陷的比较,以及误用它的后果?


编辑:

比尔K.已经正确地击中了它,但也许并没有看到事件和回调函数之间的重要差异的重要性,无论如何.触发器实际上导致代码在每次事件发生时执行; 只有在为一个事件注册时才会发生回调(绝大多数事件都不是这样); 即便如此,在大多数情况下,回调的第一个操作是取消注册自身(或者至少回调包含一个限定出口,因此它只执行一次.)

如果你编写一个触发器,它将在每次事件发生时可靠地执行,因为没有办法注册或注销代码段.

触发器是一种将重复逻辑同步插入执行线程(即同步)的方法.事件是将逻辑推迟到以后的手段(即实现异步性).

在这两种情况下都有例外和缓解,但触发器和回调的基本模式在意图和实现方面大多相反.通常这种区别似乎没有完全沉没.(恕我直言,YMMV).:d



1> Bill Karwin..:

他们不是一回事,但他们并不是无关紧要的.

在这两种情况下,机制大致可以描述如下:

某些代码块声明状态变化的"兴趣".

您的应用会影响一些变化.

系统运行代码块以响应更改.

数据库触发器可能更像是对特定事件感兴趣的回调函数.

这是一个类比:事件是你投掷的橡皮球.触发器是一只追逐抛球的狗.

如果您想到的其他一些区别使其"危险"(注意:OP已经编辑了这个选择的单词)来比较触发器和事件,您可以描述您的意思.


触发器是一种将重复逻辑同步插入执行线程(即同步)的方法.事件是将逻辑推迟到以后的手段(即实现异步性).

好的,我更清楚地看到你的意思.但我认为这在某些方面取决于实施.我不认为事件处理程序必须取消注册; 这取决于您使用的系统.例如,UNIX信号处理程序必须防止自己在处理新信号时捕获新信号.但是Tomcat容器中的Java servlet应该是线程安全的,因为它可以由多个线程同时调用.他们都是不同类型的事件处理者.

事件处理程序可以是同步的或异步的.发布/订阅系统中的处理程序是否可以读取最近发布的消息,但在处理程序注册其兴趣之前?或者只是同时发布消息?


将触发器视为与事件处理程序不同的另一个重要原因是:我经常建议不要在影响数据库外部状态的触发器执行任何操作.

例如,在触发器内发送电子邮件,写入文件,发布到Web服务或分支进程是不合适的.如果除了产生触发器的事务之外没有其他原因可以回滚,但是你无法回滚那些外部效果.您甚至可能不使用显式事务,但是说您在BEFORE触发器中发送电子邮件,但由于NOT NULL约束或其他原因操作失败.

相反,在确认SQL操作成功并且提交了事务之后,所有这些工作都应该由一个应用程序中的代码完成.

人们不断尝试在触发器内做不适当的工作太糟糕了.MySQL的高级开发人员推动UDF在memcached中读写数据.哇 - 我刚注意到这些已经成为MySQL 6.0产品!令人震惊!

所以这是另一种类比的尝试,将触发器和事件与刑事审判过程进行比较:

BEFORE触发器是指控.

AFTER触发器是起诉书.

在作出有罪判决后,COMMIT被定罪.

ROLLBACK是无辜判决后的无罪释放.

你只想在犯罪者被判有罪后将其绳之以法.

而EVENT本身就是犯罪.


所以当2只狗抓住同一个球时,僵局就是这样吗?;)
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有