mnesia数据库学习笔记三
事务及其它访问事务属性,包括原子性,一致性,隔离性,持久性
锁
脏操作
记录名字与表名字
活动概念与访问上下文
嵌套事务
模式匹配
Iteratoin
1、事务属性
Mnesia事务就是将一系列数据库操作封装在一个函数块中。函数块作为一个事务进行运行所有叫作函数对象。保作将影响到所有相关节点上。
Mnesia提供了如下重要属性:事务函数内部不涉及操作在其它事务中,当它在执行一系列表操作时
事务保证了要么在所有节点上操作成功,要么失败但没有在任何节点上产生负作用
提供了Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Durability(持久性).ACID.
2、锁
Mnesia使用5种锁读锁, 在复制记录读前加读锁
写锁, 在事务写记录前,会在指定记录的所有复件上添加写锁
读表锁,如果一个事务遍历整个表搜索指定条件记录,最低效是设置记录锁,同时也是大量内存消耗。些时可以指定一个读表锁。
写表锁,如果一个事务要大量写入一个表,最好你用写表锁
粘锁,当一个事务操作完成后,锁依然存在。
Mnesia采用动态策略应对如mnesia:read/1,自动添加和释放锁。程序员无须考虑。
Mnesia不用担心死锁问题,当系统怀疑某个锁死锁时,它会释放该锁,然后再执行一遍, 多个相同事务不能保证顺序执行,但可以保证都执行。程序员不能设定某个事务的优先级。
切不可执行代码带有事务副作用。如在receive语句在事务,可能产生系统假死等。
当一个事务异常终止时,Mnesia会自动的释放其持有的所有锁。
Mnesia函数:
mnesia:transaction(Fun) -> {aborted, Reason} | {atomic, Value},该函数执行一个带函数Fun的事务。
mnesia:read({Tab, Key}) -> transaction abort | RecordList, 返回所有带Key的记录
mnesia:wread({Tab, Key}),该函数和上一函数相同,除由读锁改为写锁,如果执行一个读记录,修改, 写入记录,那么直接用写锁效率更高。
mnesia:write(Record).写入一条记录到数据库
mnesia:delete({Tab, Key}),删除指定表键的所有记录
mnesia:delete_object(Record)用Record的OID删除对应记录
粘锁:
普通情况下mnesia每次写入操作的时候,都会锁住所有复件。如果针对一个大量写入到在一个复件的情况下, 那么粘锁就可以派上用场了。在没有其它复件存在的情况下,粘锁和普通锁差不多,没有什么特别影响。
粘锁在第一次使用后, 并不立即释放。下次我们使用粘锁在同一节点的同一记录上,那么这个粘锁就已经设置好了。所有效率更高。多用于一主多从库&