上一篇博文介绍了mnesia的事务准备阶段,在其transaction上下文中执行了传入的函数,该函数为
fun() -> mnesia:write({user, me, 12345}) end
此后将继续分析。
mnesia_tm.erl
apply_fun(Fun, Args, Type) ->
Result = apply(Fun, Args),
case t_commit(Type) of
do_commit ->
{atomic, Result};
do_commit_nested ->
{nested_atomic, Result};
{do_abort, {aborted, Reason}} ->
{'EXIT', {aborted, Reason}};
{do_abort, Reason} ->
{'EXIT', {aborted, Reason}}
end.
mnesia.erl
write(Val) when is_tuple(Val), tuple_size(Val) > 2 ->
Tab = element(1, Val),
write(Tab, Val, write);
write(Tab, Val, LockKind) ->
case get(mnesia_activity_state) of
{?DEFAULT_ACCESS, Tid, Ts} ->
write(Tid, Ts, Tab, Val, LockKind);
{Mod, Tid, Ts} ->
Mod:write(Tid, Ts, Tab, Val, LockKind);
_ ->
abort(no_transaction)
end.
之前已由mnesia_tm:execute_outer在进程字典内记录了事务上下文信息,此处在mnesia:write内重新取回,若无法取得,则表明mnesia:write未处于某个上下文中,将中止写操作。
write(Tid, Ts, Tab, Val, LockKind)
when is_atom(Tab), Tab /= schema, is_tuple(Val), tuple_size(Val) > 2 ->
case element(1, Tid) of
ets ->
?ets_insert(Tab, Val),
ok;
tid ->
Store = Ts#tidstore.store,
Oid = {Tab, element(2, Val)},
case LockKind of
write ->
mnesia_locker:wlock(Tid, Store, Oid); %%----------->下一章 锁请求过程
sticky_write ->
mnesia_locker:sticky_wlock(Tid, Store, Oid);
_ ->
abort({bad_type, Tab, LockKind})
end,
write_to_store(Tab, Store, Oid, Val);
Protocol ->
do_dirty_write(Protocol, Tab, Val)
end;
此处Store为事务管理器创建的临时ets表,Oid为{表名,键名},将来会频繁用到。事务写要求mnesia向所有副本结点请求锁,因此需要一次全局锁请求广播,锁请求过程将在下一章中进行分析,此处先分析请求到锁的情形。
一旦获得锁,mnesia需要进行临时数据存储过程,将数据写入临时ets表中。
write_to_store(Tab, Store, Oid, Val) ->
case ?catch_val({Tab, record_validation}) of
{RecName, Arity, Type}
when tuple_size(Val) == Arity, RecName == element(1, Val) ->
case Type of
bag ->
?ets_insert(Store, {Oid, Val, write});
_ ->
?ets_delete(Store, Oid),
?ets_insert(Store, {Oid, Val, write})
end,
ok;
{'EXIT', _} ->
abort({no_exists, Tab});
_ ->
abort({bad_type, Val})
end.
write_to_store以一种不同的方式记录了数据的更新方式,即在临时表中记录{{Tab, Key}, Val, write}这样的内容,临时完成写操作。
mnesia:write将首先检查是否处于某个访问上下文中,当发现位于transaction上下文中时,需要向所有副本结点请求锁,请求到锁之后,需要把更新内容写入临时表。
未完待续...
分享到:
相关推荐
session, specify a Mnesia database directory, initialize a database schema, start Mnesia, and create tables. Initial prototyping of record definitions is also discussed. • Build a Mnesia Database ...
分片后,每个分片就像一个普通的表,可以独立地进行复制、移动等操作。Mnesia 的 table fragmentation 解决方案有以下特点: 1. 使用 Linear Hashing 算法进行分片,使得管理变得更加方便。 2. 每个分片都可作为...
二、为什么开源最最最最主要的原因还是因为小程序不允许个人发布这种用户可以输入功能的小程序,导致没有用户使用其次是因为,我个人觉得它是一款不错的软件,希望开源后可以让它更加的完善 从功能上来说:它的确...
Erlang以其并发处理、容错性和高效性能在分布式系统领域备受推崇,而AMNESIA则进一步扩展了Erlang的功能,使开发者能够在Erlang环境中更自然地操作数据库。 在AMNESIA中,数据库操作被抽象化,使得程序员可以使用...
Api-Social-Amnesia.zip,忘记过去。社交健忘症确保你的社交媒体帐户只显示你最近的历史,而不是5年前“那个阶段”的帖子。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的...
语言:English (United States) 遗忘的延伸 Chrome失忆症是一个Chrome扩展程序,可让您有选择地不记得自己的任何浏览历史记录。...有关更多信息,请访问https://github.com/DanielBok/chrome-amnesia。
《Mnesia用户手册》是专为理解和操作Erlang编程语言中的Mnesia数据库管理系统而编写的详尽指南。Mnesia是Erlang OTP (Open Telephony Platform) 库中的一个核心组件,它是一个强大的分布式数据库系统,特别适用于...
失忆症是一种提醒,允许您定义警报,贴纸(贴子)以提醒您一些重要的内容以及有关所需内容的注释。 可以将警报编程为在给定时间显示,可以在桌面上放置贴纸以随时查看。
- **锁**:为了管理并发访问,Mnesia 使用锁机制来控制对数据的读写操作。有记录级锁和表级锁,以防止冲突并确保数据的一致性。 5. **查询和操作** Mnesia 提供了一套丰富的查询语言(QLC,Query List ...
3. **紧密集成Erlang**:Mnesia与Erlang编程语言紧密集成,允许开发者使用Erlang函数直接操作数据库,从而简化了开发流程并提高了效率。 4. **事务处理**:Mnesia支持原子性、一致性、隔离性和持久性(ACID)事务,...
8.附录.A:Mnesia.错误信息 8.1.Mnesia.中的错误 9.附录.B:备份回调函数接口 9.1.Mnesia.备份回调行为 10.附录.C:作业存取回调接口 10.1.Mnnesia.存取回调行为 11.附录.D:分片表哈希回调接口 11.1....
#### 二、Mnesia的核心特性 **1. 分布式架构** - Mnesia 支持分布式数据库管理,允许多个节点共享数据,这对于电信系统尤其重要,因为这些系统往往需要处理大量的并发用户请求。 **2. 高容错性** - 由于电信...
8 附录 A : Mnesia 错误信息 . . .. . . 75 8.1 Mnesia 中的错误 . . . . .. . 75 9 附录 B :备份回调函数接口 . . .. . .. . . .. . 76 9.1 Mnesia 备份回调行为 . . .. . . . .. . 76 10 附录 C :作业存取...
在事务和上下文访问方面,Mnesia提供了事务属性定义、锁机制、脏操作、记录名与表名映射、作业概念、嵌套事务、模式匹配、迭代等高级功能,支持复杂的数据库操作。 Mnesia的系统信息部分涵盖了数据库配置数据、内核...
"Amnesia"是一个可能与计算机安全或数据丢失相关的主题,暗示了系统或用户可能遭遇了某种形式的记忆丧失,即数据无法访问或丢失的情况。在IT领域,这种情况通常涉及到磁盘故障、病毒攻击、误操作或者软件错误。"Post...