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

Events 我需要一个类比:触发器和事件,events,triggers,Events,Triggers,还有一个问题,我偶尔会遇到一个误解。一些提问者似乎认为触发器对于数据库就像事件对于OOP一样重要 有没有人能用一个很好的类比来解释为什么这是一个有缺陷的比较,以及误用它的后果 编辑: Bill K.说得对,但不管怎么说,可能没有看到事件和回调函数之间的关键区别的重要性。触发器实际上使代码在每次事件发生时执行;回调仅在为某个事件注册时发生(绝大多数事件不是这样);即使如此,在大多数情况下,回调的第一个操作是取消注册自身(或者至少回调包含一个限定退出,因此它只执行一次) 如果您编写触发器,它将在每

还有一个问题,我偶尔会遇到一个误解。一些提问者似乎认为触发器对于数据库就像事件对于OOP一样重要

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


编辑:

Bill K.说得对,但不管怎么说,可能没有看到事件和回调函数之间的关键区别的重要性。触发器实际上使代码在每次事件发生时执行;回调仅在为某个事件注册时发生(绝大多数事件不是这样);即使如此,在大多数情况下,回调的第一个操作是取消注册自身(或者至少回调包含一个限定退出,因此它只执行一次)

如果您编写触发器,它将在每次事件发生时持续执行,因为无法注册或注销代码段

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


在这两种情况下都有例外和缓解措施,但触发器和回调的基本模式在意图和实现上大多相反。通常,这种区别似乎还没有完全被理解。(IMHO,YMMV):它们不是同一件事,但也不是不相关的

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

  • 某些代码块声明状态更改的“兴趣”
  • 您的应用程序会影响一些更改
  • 系统运行代码块以响应更改
也许数据库触发器更像是对特定事件感兴趣的回调函数

这里有一个类比:这个项目是你扔的一个橡皮球。扳机是一只追逐抛来的球的狗

如果您认为还有其他一些差异使得比较触发器和事件变得“危险”(注意:OP将这个词的选择删去了),您可以描述一下您的意思


触发器是插入的一种方式 将逻辑同步地重复到 执行线程(即。 同步性)。事件是解决问题的一种手段 将逻辑延迟到以后(即。 实现异步性)

好吧,我明白你的意思了。但我认为它在某些方面取决于实施情况。我不认为事件处理程序必须注销自己;这取决于你使用的系统。例如,UNIX信号处理程序必须防止自己在处理新信号时捕获新信号。但是Tomcat容器中的Javaservlet应该是线程安全的,因为它可能被多个线程并发调用。它们都是不同类型的事件处理程序

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


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

例如,在触发器中发送电子邮件、写入文件、发布到web服务或分叉进程是不合适的。如果不是因为产生触发器的事务以外的其他原因,则可以回滚触发器,但不能回滚这些外部效果。您甚至可能没有使用显式事务,但假设您在BEFORE触发器中发送了一封电子邮件,但由于NOTNULL约束或其他原因,操作失败

相反,所有这些工作都应该在确认SQL操作成功并提交事务后,通过应用程序中的代码完成

人们总是试图在触发器内做不适当的工作,这太糟糕了。MySQL的高级开发人员推动UDF在memcached中读写数据。哇,我刚注意到这些有!!令人震惊

这是另一个类比的尝试,将触发和事件与刑事审判过程相比较:

  • 触发前是一种指控
  • 事后触发是起诉
  • 犯罪是有罪判决后的定罪
  • 回滚是无罪判决后的无罪释放
你只想在罪犯被定罪后把他们关进监狱

  • 而事件本身就是犯罪

我相信“他”指的是某些吹毛求疵的态度,即基本理性在扳机中的意义。因此,僵局是指当两只狗抓住同一个球时?;)一个具体的例子是从触发器中使用CLR调用web服务。我认为这很危险。看起来MySQL已经陷入了慢性太阳病——微软嫉妒症。正在尝试为每个功能匹配功能。