erlang学习: Mnesia Erlang数据库3

Mnesia数据库删除实现和事务处理

-module(test_mnesia).
-include_lib("stdlib/include/qlc.hrl").

-record(shop, {item, quantity, cost}).
%% API
-export([insert/3, select/0, select/1, delete/1, transaction/1,start/0, do_this_once/0]).
start() ->
  mnesia:start().

insert(Name, Quantity, Cost) ->
  Row = #shop{item = Name, quantity = Quantity, cost = Cost},
  io:format("insert ~p~n", [Row]),
  F = fun() ->
    mnesia:write(Row)
      end,
  mnesia:transaction(F).

delete(Item) ->
  Oid = {shop, Item},
  io:format("delete ~p~n", [Oid]),
  F = fun() ->
    mnesia:delete(Oid)
      end,
  mnesia:transaction(F).

select() ->
  do(qlc:q([X || X <- mnesia:table(shop)])).
select(Num) ->
  do(qlc:q([X || X <- mnesia:table(shop), X#shop.quantity =< Num])).
%%事务函数
transaction(Num) ->
  F = fun
        () ->
          [Apple] = mnesia:read({shop, apple}),
          NApple = Apple#shop.quantity,
          Apple1 = Apple#shop{quantity = NApple + Num},
          mnesia:write(Apple1),
          [Orange] = mnesia:read({shop, orange}),
          NOrange = Orange#shop.quantity,
          if
            NOrange >= Num ->
              N1 = NOrange - Num,
              Orange1 = Orange#shop{quantity = N1},
              mnesia:write(Orange1);
            true ->
              mnesia:abort(oranges)
          end
      end,
  mnesia:transaction(F).
do(Q) ->
  F = fun
        () ->
          qlc:e(Q)
      end,
  {atomic, Val} = mnesia:transaction(F),
  Val.


do_this_once() ->
  mnesia:create_schema([node()]),
  mnesia:start(),
  mnesia:create_table(shop, [{attributes, record_info(fields, shop)}]),
  mnesia:stop().

删除功能实现

开始有pear后删除就没有pear了
请添加图片描述

事务功能实现

事务是一个整体,里面方法对数据库的操作要么同时操作完毕,要么都不操作

我的事务函数中输入数据,将苹果增加改数量,橘子减少该数量
开始操作成功,数据正确
后面橘子数量不足,因此苹果的改动也没有完成,数据正确
请添加图片描述

Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用。 目 录 1 、介绍 . . .. . .. . . .. . 4 1.1 关于 Mnesia . . .. . .. . . .. . 4 1.2 Mnesia 数据库管理系统( DBMS ) . . .. . . .. . 4 2 、开始 Mnesia . . .. . .. . . .. . 7 2.1 首次启动 Mnesia . . .. . .. . .. . 7 2.2 一个示例 . . .. . . . .. . 8 3 、构建 Mnesia 数据库 . . .. . .. . 22 3.1 定义模式 . . .. . .. . .. . 22 3.2 数据模型 . . .. . .. . .. . 23 3.3 启动 Mnesia . . . 23 3.4 创建新表 . . .. . .. . .. . 26 4 、事务和其他上下文存取 . . .. . .. . .. . 29 4.1 事务属性 . . .. . .. . .. . 29 4.2 锁 . . .. . .. . .. . 30 4.3 脏操作 . . .. . . .. . 33 4.4 记录名与表 . . .. . .. . . .. . 34 4.5 作业( Activity )概念和多种存取上下文 . . .. . .. . 37 4.6 嵌套事务 . . .. . .. . .. . 38 4.7 模式匹配 . . .. . .. . .. . 39 4.8 迭代 . . .. . . .. . 41 5 、其它 Mnesia 特性 . . .. . .. . .. . 45 5.1 索引 . . .. . . .. . 45 5.2 分布和容错 . . .. . .. . . .. . 45 5.3 表分片 . . .. . . . .. . 46 5.4 本地内容表 . . .. . .. . . .. . 53 5.5 无盘节点 . . .. . .. . .. . 54 5.6 更多的模式管理 . . .. . .. . .. . 55 5.7 Mnesia 事件处理 . . . . .. . 55 5.8 调试 Mnesia 应用 . . .. . . 57 5.9 Mnesia 里的并发进程 . . .. . . . .. . 58 5.10 原型 . . .. . . .. . 58 5.11 Mnesia 基于对象的编程 . . .. . .. . .. . . 61 6 Mnesia 系统信息 . . .. . .. . . .. . 64 6.1 数据库配置数据 . . .. . .. . .. . 64 6.2 内核转储 (Core Dumps ). . .. . .. . .. . 64 6.3 转储表 . . .. . . . .. . 64 3 6.4 检查点 . . .. . . . .. . 64 6.5 文件 . . .. . . .. . 65 6.6 在启动时加载表 . . .. . .. . .. . 67 6.7 从通信失败中恢复 . . .. . .. . . .. . 68 6.8 事务的恢复 . . .. . .. . . .. . 68 6.9 备份、回滚以及灾难恢复 . . .. . .. . . .. . 69 7 Mnsia 与 SNMP 的结合 . . .. . .. . 74 7.1 结合 Mnesia 与 SNMP . . .. . . . .. . 74 8 附录 A : Mnesia 错误信息 . . .. . . 75 8.1 Mnesia 中的错误 . . . . .. . 75 9 附录 B :备份回调函数接口 . . .. . .. . . .. . 76 9.1 Mnesia 备份回调行为 . . .. . . . .. . 76 10 附录 C :作业存取回调接口 . . .. . . .. . 83 10.1 Mnnesia 存取回调行为 . . . . .. . 83 11 附录 D :分片表哈希回调接口 . . . .. . 92 11.1 mnesia_frag_hash 回调行为 . . .. . . .. . . 92
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值