我的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 方法.如果在事务的闭包内抛出异常,事务将会被自动还原.如果闭包运 ...
随机推荐
- WPF Image控件的Source属性是一个ImageSource对象
1.固定的图片路径是可以的,如下: <Image Source="../test.png" /> 2.绑定的Path是一个String类型的图片路径,而实际情况它需要的 ...
- php的cookie和session相同主域名共享
如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im el ...
- [python] 创建临时文件-tempfile模块
This module generates temporary files and directories. It works on all supported platforms.In versio ...
- wget下载工具
转自于:http://www.jb51.net/LINUXjishu/86326.html 1.使用wget下载单个文件 e.g. wget http://cn.wordpress.org/word ...
- PHP入门教程-开发环境搭建
1.PHP简介: PHP是能让你生成动态网页的工具之一.PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP. 2.学习需要基础: a.HTML b.Ja ...
- mvc+mysql+EF
网上有很多关于EF在联机情况下利用nuget管理器安装的案例,我就讲一下脱机状况吧! 一.建立一个文件夹,例如D:/Packages 放入安装EF和mysql需要的包:EntityFramework. ...
- hdoj 1272 小希的迷宫
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...
- makefile命令基本运用(一)
一.makefile介绍: 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译 ...
- babel 配置探究及错误解析
前面的文章说到了react 15的一些特性,众所周知react搭配es6或者叫es2015的开发模式更加的方便快捷.不过提到es2015这个毕竟没有被浏览器广泛支持的规范,要想能够快快乐乐的应用起来, ...
- 置入式模型inclusion model和显示具现化
1.置入式模型 链接错误: 大多数非模板程序代码的组织如下:A,类声明在头文件中: B:全局变量和非inline函数在cpp文件中定义 但是,如果模板程序也这样组织,则会出错.原因在于:函数模板的定义 ...