Mnesia 事件处理

2009-04-11
Mnesia会产生两类事件:系统事件(system events)和表事件(table events),用户可创建一个进程来订阅Mnesia所产生的事件,有如下两个相关的函数:

mnesia:subscribe(EventCategory)
当有事件发生时发送一个事件的copy给调用此函数的进程。

mnesia:unsubscribe(EventCategory)
取消事件订阅,不再接收Mnesia产生的事件。

EventCategory可以是system、{table, Tab, simple}或{table, Tab, detailed}。事件会以进程间消息的形式发送给订阅了Mnesia事件的进程,系统事件的格式为{mnesia_system_event, Event},表事件的格式则为{mnesia_table_event, Event}。

System Events
系统事件有如下几种:

{mnesia_up, Node}
Mnesia在节点Node上被启动;

{mnesia_down, Node}
Mnesia在节点Node上停止了运行;

{mnesia_checkpoint_activated, Checkpoint}
一个与本节点相关的checkpoint被激活了;

{mnesia_checkpoint_deactivated, Checkpoint}
一个与本节点相关的checkpoint被激死(:P)了~~

{mnesia_overload, Details}
本节点上的Mnesia负载过重,可能因为对硬碟的读写请求超过了Mnesia的处理能力,如果不做任何处理可能会导致硬碟空间不足;也可能是Mnesia处理事务的速度跟不上事务的请求速度,事务堆栈可能会越来越大,直至耗尽内存或请求速度减缓。对存在异地备份或位于远程节点上的表发起大量的脏操作(dirty updates)时也可能会引发此事件;

{inconsistent|_database, Context, Node}
Mnesia发现数据库可能存在不一致的情况;

{mnesia_fatal, Format, Args, BinaryCore}
Mnesia发生了致命错误,即将在短时间内终止;

{mnesia_info, Format, Args}
调试系统时,Mnesia发现了一些应用程序可能感兴趣的东东;

{mnesia_error, Format, Args}
Mnesia发生了错误;

{mnesia_user, Event}
某应用程序触发了函数mnesia:report_event(Event),可用于调试Mnesia。

Table Events
表事件在数据表被更新时发生,分为simple和detailed两种,simple事件包括:

{write, NewRecord, ActivityId}
有新记录被写入;

{delete_object, OldRecord, ActivityId}
记录OldRecord可能被删除了(可能?),如果表类型为bag,则可能还存在其他与OldRecord主键相同的记录;

{delete, {Tab, Key}, ActivityId}
一个或多个记录可能被删除了(可能??),表里所有主键为Key的记录都已被删除;

detailed事件包括:

{write, Table, NewRecord, [OldRecords], ActivityId}
有新记录被写入;

{delete, Table, What, [OldRecords], ActivityId}
可能有记录被删除(又是可能....),What可能是{Table, Key}或{RecordName, Key, ....}

M-OSCAR | Powered by Blogger | Entries (RSS) | Comments (RSS) | Designed by MB Web Design | XML Coded By Cahayabiru.com