我的ORM之五-- 事务

时间:2022-09-03 17:18:04

我的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&plus;ORM&plus;逻辑代码

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

  5. python---django中orm的使用(5)数据库的基本操作&lpar;性能相关:select&lowbar;related&comma;和prefetch&lowbar;related重点&rpar;(以及事务操作)

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

  6. day56&lowbar;9&lowbar;20orm中的关键字段,orm查询13方法整合,查询优化和事务。

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

  7. 打造Orm经典&comma;创CRUD新时代&comma;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. java静态方法调用&amp&semi;&amp&semi;构造函数&amp&semi;&amp&semi;静态块

    静态方法,也就是使用static声明的方法,在虚拟机启动加载类的时候就进行了创建,所以使用到静态方法时,直接使用类名点静态方法即可调用.java在执行静态方法前,不会调用构造函数:构造函数是在实例化j ...

  2. ads 调试

    1.路径错误,中文名称 2.定义错误

  3. 虚拟Linux 訪问win7共享文件夹方法

    虚拟机訪问win7的共享文件夹 首先安装增强功能,这个不用多说 再者选择菜单中的设备->共享目录,设置为固定分配和自己主动挂载 在终端敲入命令df:发现有自己创建共享的文件夹 然后运行例如以下命 ...

  4. 5&period;6&period;1 Boolean类型

    Boolean类型是与布尔值对应的引用类型.要创建Boolean对象,可以像下面这样调用Boolean构造函数并传入true或false值. var booleanObject=new Boolean ...

  5. HTTP学习笔记--HTTP报文

    报文流     HTTP报文在客户端.服务器和代理之间流动.“流入”.“流出”.“上游”.“下游”这些术语用来描述报文方向. 报文流入源端服务器     流入:流向服务器     流出:流向用户Age ...

  6. js第一天 innerHTML和value 的区别

    innerHTML在JS是双向功能:获取对象的内容 或 向对象插入内容:如:<div id="aa">这是内容</div> ,我们可以通过 document ...

  7. HDU&lt&semi;1372&gt&semi;&sol;bfs

    题目连接 简单bfs搜索 #include <set> #include <map> #include <cmath> #include <queue> ...

  8. 压力测试工具 ab

    ab 是Apache 自带的一个压力测试工具,命令行,是 ApacheBench 命令的缩写. ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基 ...

  9. mysql查看所有触发器以及存储过程等操作集合

    今天在做每个月定时扣费的功能 用到了Mysql的Event Scheduler 昨完之后发现一个问题 Event Scheduler 默认是不开启的 要在mysql内执行SET GLOBAL even ...

  10. 实例详析ImageView的adjustViewBonds和scaleType

    android:adjustViewBounds是否保持宽高比.需要与maxWidth.MaxHeight一起使用,否则单独使用没有效果. 设置View的最大高度,单独使用无效,需要与setAdjus ...