紧接着上文,这里主要记录事务操作,实现多实体的功能

在SqlTran类中添加方法如下:

1、两个不同实体类型的事务方法:

         /// <summary>
/// 执行事务(事务中不同实体)
/// </summary>
/// <typeparam name="T">实体</typeparam>
/// <param name="method">要执行的方法(SqlTransaction 默认传入为null)</param>
/// <param name="obj1">参数值</param>
/// <returns></returns>
public static Int32 ExecuteTran<M, N>(Func<M, SqlTransaction, Int32> method1, Func<N, SqlTransaction, Int32> method2, M obj1, N obj2)
where M : new()
where N : new()
{
Int32 count = ;
SqlConnection conn = null;
SqlTransaction tran = null;
try
{
conn = new SqlConnection(Repository.connStr);
conn.Open();
tran = conn.BeginTransaction(); count += method1(obj1, tran);
count += method2(obj2, tran); tran.Commit();
return count;
}
catch (Exception ex)
{
tran.Rollback();
return -;
}
finally
{
if (tran != null)
tran.Dispose();
if (conn != null)
{
conn.Close();
conn.Dispose();
}
} } /// <summary>
/// 执行事务(事务中不同实体)
/// </summary>
/// <typeparam name="T">实体</typeparam>
/// <param name="method">要执行的方法(SqlTransaction 默认传入为null)</param>
/// <param name="obj1">参数值</param>
/// <returns></returns>
public static Int32 ExecuteTran<M, N>(IList<Func<M, SqlTransaction, Int32>> methods1, IList<Func<N, SqlTransaction, Int32>> methods2, IList<M> objs1, List<N> objs2)
where M : new()
where N : new()
{
Int32 count = ;
SqlConnection conn = null;
SqlTransaction tran = null;
try
{
conn = new SqlConnection(Repository.connStr);
conn.Open();
tran = conn.BeginTransaction(); if (methods1.Count() != objs1.Count())
return -;
if (methods2.Count() != objs2.Count())
return -; for (int i = ; i < objs1.Count(); i++)
count += methods1[i](objs1[i], tran);
for (int i = ; i < objs2.Count(); i++)
count += methods2[i](objs2[i], tran); tran.Commit();
return count;
}
catch (Exception ex)
{
tran.Rollback();
return -;
}
finally
{
if (tran != null)
tran.Dispose();
if (conn != null)
{
conn.Close();
conn.Dispose();
}
} }

参数为List的时候,注意对应关系

methods1-->objs1

methods2-->objs2

2、测试方法:

         public void Test()
{
Repository repository = new Repository(); Orders order11 = new Orders() { Id = , Name = "name11" };
Orders order21 = new Orders() { Id = , Name = "name12" };
Orders order31 = new Orders() { Id = , Name = "name13" };
OrderDetail orderDetail11 = new OrderDetail() { Id = , OrderId = , Name = "namedetail11" };
OrderDetail orderDetail12 = new OrderDetail() { Id = , OrderId = , Name = "namedetail12" }; var count1 = SqlTran.ExecuteTran<Orders, OrderDetail>(repository.AddOrder, repository.AddOrderDetail, order11, orderDetail11); //不同方法,不同实体类型 List<Func<Orders, SqlTransaction, Int32>> listFuncOrders = new List<Func<Orders, SqlTransaction, Int32>>();
List<Func<OrderDetail, SqlTransaction, Int32>> listFuncOrdersDetail = new List<Func<OrderDetail, SqlTransaction, Int32>>();
List<Orders> listOrder = new List<Orders>();
List<OrderDetail> listOrderDatail = new List<OrderDetail>(); listFuncOrders.Add(repository.AddOrder);
listFuncOrders.Add(repository.AddOrder);
listOrder.Add(order21);
listOrder.Add(order31); listFuncOrdersDetail.Add(repository.AddOrderDetail);
listFuncOrdersDetail.Add(repository.UpdateOrderDetail);
listOrderDatail.Add(orderDetail12);
orderDetail11.Name = "namedetail11Update";
listOrderDatail.Add(orderDetail11); var count2 = SqlTran.ExecuteTran<Orders, OrderDetail>(listFuncOrders, listFuncOrdersDetail, listOrder, listOrderDatail);
}

3、三个不同实体类型的事务方法:定义

public static Int32 ExecuteTran<M, N, T>(Func<M, SqlTransaction, Int32> method1, Func<N, SqlTransaction, Int32> method2, Func<T, SqlTransaction, Int32> method3, M obj1, N obj2, T obj3)
where M : new()
where N : new()
where T : new()

所以根据实体的个数进行定义就ok,之后就可以重用了

缺点之一:每个事务方法中大部分的代码是一样的,只有委托执行方法部分有微小的变化(如:count += method(obj1, tran); ),本人目前没有更好的办法把这块相同的代码提取出来进行共用,希望看到这里的同行,如果有好的解决方案,希望能拿出来互相交流!指点迷津。

如何实现SQL事务的提交,又不对外进行污染(2)的更多相关文章

  1. 如何实现SQL事务的提交,又不对外进行污染

    一.以下是本人的一点思路: 1.在事务方法中,参数运用委托Func,选用Func 的原因是多入参,单一出参2.事务传参运用泛型,选用泛型的原因是可以减少代码量,类型安全 二.说明中涉及4个类:1.Or ...

  2. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  3. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  4. 存储过程中使用事务,sql server 事务,sql事务

    一.存储过程中使用事务的简单语法       在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 ...

  5. SQL事务

    一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为最小的 ...

  6. SQL—— 事务

    SQL 事务: 1.  定义: 事务是作为单个逻辑单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行.要么都不执行,事务是一个不可分割的工作逻辑单元.这特别适用于多用户同时操作的数据通信 ...

  7. SQL事务隔离级别

    数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况. 更新丢失(Lost update) 两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修 ...

  8. SQL事务与并发

    1.Transaction(事务)是什么: 事务是作为单一工作单元而执行的一系列操作.包括增删查改. 2.事务的种类: 事务分为显示事务和隐式事务: 隐式事务:就是平常我们使用每一条sql 语句就是一 ...

  9. SQL 事务及实例演示

    简介 事务,英文名称是transaction.是在对数据库进行管理操作过程中一个逻辑单位,由有限的操作序列构成. 其实这个概念很好懂,简单理解就是:事务就是在使用数据库中的一个操作,由一些操作放到一起 ...

随机推荐

  1. NET SignalR 与 LayIM2.0

    ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现   前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于L ...

  2. 使用jquery 操作checkbox

    checkbox 的全选与全不选以及获取选择的值. 效果: <!DOCTYPE html> <html lang="en"> <head> &l ...

  3. cf C. Purification

    http://codeforces.com/contest/330/problem/C 这道题分三种情况.有一行全是E,有一列全是E,还有一种为无解的情况. #include <cstdio&g ...

  4. Android文件下载(实现断点续传)

    本文将介绍在android平台下如何实现多线程下载,大家都知道,android平台使用java做为开发语言,所以java中支持的多线程下载方式在android平台下都支持,其中主要有两种方式可以实现多 ...

  5. 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯

    20个最强的基于浏览器的在线代码编辑器 - OPEN资讯 20个最强的基于浏览器的在线代码编辑器

  6. fcntl函数加文件锁

    对文件加锁是原子性的,可以用于进程间文件操作的同步.在linux下,有三个函数可以对文件进程加锁,分别是fcntl.flock.lockf.这里只说fcntl,它的用法也是最复杂的. fcntl是fi ...

  7. Hive MapJoin

    摘要 MapJoin是Hive的一种优化操作,其适用于小表JOIN大表的场景,由于表的JOIN操作是在Map端且在内存进行的,所以其并不需要启动Reduce任务也就不需要经过shuffle阶段,从而能 ...

  8. linux core dump学习

    1. core dump是什么? core dump又叫核心转储,当操作系统收到特定的signal时, 会生成某个进程的core dump文件.这样程序员可以根据 已经生成的core dump文件来d ...

  9. install-file -Dfile=J:\project01\workspace\service\lib\javapns-jdk16-163.jar -DgroupId=org.json -Dar

    今天在开发项目的时候发现了一个问题,所以通过博客来记录起来! 为了以后在问题的解决方面能得到借鉴! 问题的现象是这种: 这样会报错的.pom.xml文件他在编译.检查他的文件语法的时候是须要參考库中的 ...

  10. Verilog 读写文件

    Verilog 读写文件 在数字设计验证中,有时我们需要大量的数据,这时可以通过文件输入,有时我们需要保存数据,可以通过写文件保存. 读写文件testbench module file_rw_tb() ...