我的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之五-- 事务的更多相关文章

  1. Django之ORM中事务和锁

    ORM事务: 事务: 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 事务的特点: 并非任意的对数据库的操作序列都是数据库事务.数据库事务拥有以下四 ...

  2. 从JDBC到ORM的事务实现

    一.JDBC 早期SUN公司想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了.后来SUN开始与数据库厂商们讨论,最终得出的结 ...

  3. 我的ORM汇总

    MyOql是我写的ORM,目前仅支持 MSSql2005+ ,从2009年到今天,已使用过不少项目,之后会写 其它关系数据库的解析器: MySql,Sqlite,Oracle 等. 代码地址(最新版) ...

  4. 事务并发处理: DB+ORM+逻辑代码

    在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用. 1. 事务:一系列操作要么都完成,要么一个都不完成 2. 事务并发:多个事务 ...

  5. python---django中orm的使用(5)数据库的基本操作(性能相关:select_related,和prefetch_related重点)(以及事务操作)

    ################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...

  6. day56_9_20orm中的关键字段,orm查询13方法整合,查询优化和事务。

    一.常用字段. 在orm中有一些字段是常用字段: 1.AutoField 这个字段是自增的,必须填入参数primary_key=True,也就是说这个字段是表的主键,如果表类中没有自增列,就会自动创建 ...

  7. 打造Orm经典,创CRUD新时代,Orm的反攻战

    让我们开启数据库无Linq.零sql时代(续) 第一部分 MQL qq群:225656797 demo下载: 点此下载(既然下载,就支持该文,关注我的博客) Moon.Orm 5.0 (MQL版) 版 ...

  8. Django数据库--事务及事务回滚

    数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作.Django的ORM在事务方面也提供了不少的API.有事务出错的整体回滚操作,也有基于保存点的部分回滚 ...

  9. 在Laravel中使用数据库事务以及捕获事务失败后的异常

    Description 在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法.如果在事务的闭包内抛出异常,事务将会被自动还原.如果闭包运 ...

随机推荐

  1. X64操作系统组件Jmail无法正常服务问题

    故障现象: 近日,在VMware虚拟化部署迁移中,之前物理服务器中部署网站ASP组件Jmail服务一切正常,迁移完成后发现Jmail无法正常工作,其余组件能正常工作. 环境:Windows Serve ...

  2. 用OMT方法建立其分析模型: 本大学基于网络的课程注册系统。

    OMT方法是用3种模型来描述软件系统,分别是对象模型,动态模型,功能模型. 1)对象模型:课程网络注册系统 2)动态模型:序列图 3)功能模型:数据流图 0层DFD图 1层DFD图

  3. python课程第四周重点记录

    1.迭代器 names = iter(["alex","jack","rain"]) #声明列表的一个迭代器 names.__next__( ...

  4. MFC字符串转化成16进制

    //CString m_str = _T("11"); //USES_CONVERSION; //char *m_cc = T2A(m_str); //BYTE m_bb; //s ...

  5. 121. Best Time to Buy and Sell Stock (一) leetcode解题笔记

    121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...

  6. 解决Tomcat数据连接池无法释放

    近段时间,公司的检测中心报表系统(SMC)的开发人员时不时找到我,说用户老是出现无法登录的情况.前些日子因为手头上 有Jboss集群的测试工作,发现用户不能登录时,都是在Tomcat中将这个项目Rel ...

  7. SVN服务器的配置(简单易懂,带配置文件,有注释)

    这两天在服务器搭建了一个SVN服务器,一些经验,也留作后用把,有不详细的欢迎批评指正 另外关于子目录的访问配置,这块我还是不懂,希望有前辈能教我一下 1.安装SVN Serveryum install ...

  8. myeclipse2014激活

    MyEclipse2014破解教程 一. 在破解myeclipse2014之前,要先把环境变量配置好: 1)打开我的电脑--属性--高级--环境变量 2)新建系统变量JAVA_HOME 和CLASSP ...

  9. 【动态规划】bzoj1663 [Usaco2006 Open]赶集

    http://blog.csdn.net/u011265346/article/details/44906469 #include<cstdio> #include<algorith ...

  10. javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...