我的ORM之五-- 事务
单库事务与分布式事务
单库事务: 性能更好,应用于一个数据库时的场景,当数据库发生变化,如拆分为多个服务器,代码需要修改。
分布式事务:性能相对较差,但有更大的适用场景。当数据库发生变化,如拆分为多个服务器,代码可能不需要修改。
由于事务会引起资源争抢,互联网平台,越来越趋向无事务处理,追求极致的性能。
分布式事务
using (ransactionScope scope = new TransactionScope())
{
//to do something
scope.Complete();
}
单库事务
在实际应用中,我更倾向于单库事务。用法也很像分布式事务,可以嵌套。
string errorMsg = dbr.表1.ExecTransaction(()=>
{
if( 表1操作失败) return "表1失败";
if( 表2操作失败) return "表2失败";
if( 表3操作失败) return "表3失败";
var msg = 调用其它单库事务方法;
if( msg.HasValue() ) return msg;
return "";
});
在 ExecTransaction 方法中,返回空值或空字符串,表示成功。 如果返回错误信息,则事务回滚。
具体实现方法:(需根据项目修改)
实现思想:在执行事务前,先使用 lock 锁住某个表示该表的对象。使其它使用该表的事务在数据库外排队,防止死锁。
public static string ExecTransaction(this RuleBase rule, Func<string> func)
{
return ExecTransaction(rule, new LockObjectEnum(), func);
} /// <summary>
/// 单库事务安全执行方法
/// </summary>
/// <param name="rule"></param>
/// <param name="func"></param>
/// <returns></returns>
public static string ExecTransaction(this RuleBase rule, LockObjectEnum LockObj, Func<string> func)
{
var group = rule.GetGroupName().AsString(me.CorpID.ToString()); if (LockObj.HasValue() == false)
{
group.MySplit('_').All(g =>
{
var e = g.ToEnum<LockObjectEnum>();
if (e > )
{
LockObj = e;
return false;
}
return true;
});
} var ret = string.Empty; lock (rule.GetLockObject())
{
For2Recusion(LockObj.GetEnumList(), () =>
{
ret = _execTransactionWithoutLock(rule, func);
});
} return ret;
} private static void For2Recusion(LockObjectEnum[] objs, Action act, int index = )
{
if (index < objs.Length)
{
lock (MyHelper.GetLockObject("ExecTransaction." + objs[index].ToString()))
{
For2Recusion(objs, act, index + );
}
}
else
{
act();
}
} private static string _execTransactionWithoutLock(RuleBase rule, Func<string> func)
{
var msg = string.Empty;
if (dbo.CurrentScope != null && dbo.CurrentScope.Transaction != null)
{
try
{
msg = func(); if (msg.HasValue())
{
return msg;
}
}
catch (Exception e)
{
msg = e.Message;
throw;
}
return msg;
}
using (var conn = rule.GetDbConnection())
{
msg = dbo.Open(conn, () =>
{
var tran = conn.BeginTransaction();
using (var scope = new MyOqlConfigScope(tran))
{
try
{
msg = func(); if (msg.HasValue())
{
tran.Rollback();
return msg;
} tran.Commit();
}
catch (Exception e)
{
msg = e.Message; if (conn.State != ConnectionState.Closed)
{
tran.Rollback();
} throw;
}
return msg;
}
});
}
return msg;
}
我的ORM之五-- 事务的更多相关文章
- Django之ORM中事务和锁
ORM事务: 事务: 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 事务的特点: 并非任意的对数据库的操作序列都是数据库事务.数据库事务拥有以下四 ...
- 从JDBC到ORM的事务实现
一.JDBC 早期SUN公司想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了.后来SUN开始与数据库厂商们讨论,最终得出的结 ...
- 我的ORM汇总
MyOql是我写的ORM,目前仅支持 MSSql2005+ ,从2009年到今天,已使用过不少项目,之后会写 其它关系数据库的解析器: MySql,Sqlite,Oracle 等. 代码地址(最新版) ...
- 事务并发处理: DB+ORM+逻辑代码
在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用. 1. 事务:一系列操作要么都完成,要么一个都不完成 2. 事务并发:多个事务 ...
- python---django中orm的使用(5)数据库的基本操作(性能相关:select_related,和prefetch_related重点)(以及事务操作)
################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...
- day56_9_20orm中的关键字段,orm查询13方法整合,查询优化和事务。
一.常用字段. 在orm中有一些字段是常用字段: 1.AutoField 这个字段是自增的,必须填入参数primary_key=True,也就是说这个字段是表的主键,如果表类中没有自增列,就会自动创建 ...
- 打造Orm经典,创CRUD新时代,Orm的反攻战
让我们开启数据库无Linq.零sql时代(续) 第一部分 MQL qq群:225656797 demo下载: 点此下载(既然下载,就支持该文,关注我的博客) Moon.Orm 5.0 (MQL版) 版 ...
- Django数据库--事务及事务回滚
数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作.Django的ORM在事务方面也提供了不少的API.有事务出错的整体回滚操作,也有基于保存点的部分回滚 ...
- 在Laravel中使用数据库事务以及捕获事务失败后的异常
Description 在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法.如果在事务的闭包内抛出异常,事务将会被自动还原.如果闭包运 ...
随机推荐
- 【笔记】android sdk集成的eclipse中导入项目
android sdk集成的eclipse中导入项目 想要把旧的ADT项目,一模一样的导入进来,需要: 1.把项目放到,非当前ADT的workspace目录下: 2.从Project中Import,选 ...
- 过滤Xss
/** * 防xss过滤 * * @author rentingshuang <tingshuang@rrkd.cn> * @param type $string * @param typ ...
- modesim测试语句
: 'd2; Reg2 <= Reg1; i <= i + 1'b1; join : 'd2; i <= i + 1'b1; join : 'd2; Reg2 <= Reg1; ...
- 【Java学习笔记】函数的可变参数
package p2; public class ParamterDemo { public static void main(String[] args) { int sum1 = add(4,5) ...
- PBX 评测二
//由于诸事繁多,结果评测一拖再拖. 博客园的优化还行啊,PBX220搜索, 第一页,第四个就是上一篇的评测文章. 配置没有什么说的(按照说明/还有这篇无线迷你IPPBX-PBX220). 以下是在公 ...
- 验证radio 是否被选中
var radioType=document.getElementsByName("radioType"); var isCheckRadio=false; for(v ...
- Everything搜索结果显示0 Object
比较过windows本身的文档搜索功能,Everything的本地文档搜索能力简直令人咋舌,更逆天的是软件本身体积很小. 问题:打开everything时,文件列表消失,软件下方信息为0 object ...
- js数组去重的三种方法
<script type="text/javascript"> /*// 第一种冒泡法删除 var arr=[1,2,2,78,3,456,456]; for(var ...
- 《python核心编程》读书笔记——列表解析
列表解析是列表类型的方法,这种方法结合了列表的方括弧.for循环.if语句. 用for把处理后的值放入列表: squared = [ x**2 for x in range(4) ] for i in ...
- 老毛桃u盘装系统制作工具
老毛桃[url=http://www.laomaotao.cn.com/]一键u盘装系统下载[/url]告别繁琐,简单易用,一盘两用,携带方便.不需要任何技术基础,一键制作,自动完成制作,平时当U盘使 ...