如何在 Dapper.NET 中使用事务?
咨询区
Amit:
我的项目中使用 dapper.net 做数据库连接框架,有一个需求需要在多个表上执行多次插入操作,我想把它 事务化
,但我看 dapper 并没有提供类似的方式。
请问我该如何使用 dapper 来做这项工作呢?
回答区
Newteq Developer
如果用 Dapper 实现事务功能,大概有三种实现方式。
简单的事务方法
这种事务方式很原始,就是在已存在的 Connection 上创建 Transaction, 然后将事务作为参数传递到 Execute 方法中,当业务逻辑处理完后,再做 commit 提交,参考如下代码:
string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{connection.Open();using (var transaction = connection.BeginTransaction()){connection.Execute(sql, new {CustomerName = "Mark"}, transaction: transaction);connection.Execute(sql, new {CustomerName = "Sam"}, transaction: transaction);connection.Execute(sql, new {CustomerName = "John"}, transaction: transaction);transaction.Commit();}
}
使用 TransactionScope
如果你喜欢用 TransactionScope 方式,有一点要注意,那就是需要在 connection 创建之前创建 Scope,然后在 Scope 作用域内做你想做的sql操作,最后执行一个 complete 提交即可,参考如下代码:
using (var transaction = new TransactionScope())
{var sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";using (var connection = My.ConnectionFactory()){connection.Open();connection.Execute(sql, new {CustomerName = "Mark"});connection.Execute(sql, new {CustomerName = "Sam"});connection.Execute(sql, new {CustomerName = "John"});}transaction.Complete();
}
使用 Dapper Transaction 方式
这是使用 Dapper 最推荐的方式,毕竟它的代码语义太强了,你可以直接在 new 出的 Transaction 之上执行各自的sql语句,参考如下代码:
string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{connection.Open();using (var transaction = connection.BeginTransaction()){transaction.Execute(sql, new {CustomerName = "Mark"});transaction.Execute(sql, new {CustomerName = "Sam"});transaction.Execute(sql, new {CustomerName = "John"});transaction.Commit();}
}
点评区
说实话,这三种方式总结的特别好,但有一点看着很不爽,那就是在执行 Transaction 之前需要 connection.Open()
,有点繁琐,所以这一块还是可以再封装一下的。
如何在 Dapper.NET 中使用事务?相关推荐
- Camstar开发思考:如何在C#代码中控制事务
目录 开发现状 开发问题 解决方案 1)自定义UserFunction 2)预调用服务 预调用服务方案设计与实现 代码设计 实现结果 开发现状 Camstar开发过程中,业务代码通常写在以下位置: 1 ...
- Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- spring事务管理器的作用_【面试必问】Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- 在WCF中启用事务的6个步骤
目录 简介和目标 第1步:创建两个WCF服务小号 第 2 步:使用TransactionFlow的属性接口方法 第 3 步:使用TransactionScopeRequired对实现进行属性 步骤 4 ...
- 如何在 Spring 生态中玩转 RocketMQ?
作者 | 通融.洛夜 来源 | 阿里巴巴云原生公众号 RocketMQ 作为业务消息的首选,在消息和流处理领域被广泛应用.而微服务生态 Spring 框架也是业务开发中最受欢迎的框架,两者的完美契合使 ...
- 如何在Spring生态中玩转RocketMQ?
简介: RocketMQ作为业务消息的首选,在消息和流处理领域被广泛应用.而微服务生态Spring框架也是业务开发中最受欢迎的框架,两者的完美契合使得RocketMQ成为Spring Messagin ...
- @sql 单元测试_如何在SQL单元测试中使用假表?
@sql 单元测试 In this article on SQL unit testing, we will talk about how to isolate SQL unit tests from ...
- 如何在SQL Server中实现错误处理
错误处理概述 (Error handling overview) Error handling in SQL Server gives us control over the Transact-SQL ...
- yii2 跨域请求配置_如何在SpringBoot应用中实现跨域访问资源和消息通信?
允许跨域访问 CORS ( Cross Origin Resource Sharing,跨域资源共享)机制允许Web应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行.浏览器支持在API容器中 ...
最新文章
- set debug mode for flex builder
- Django2.0——模板渲染(一)
- 用surfaceView实现高性能动画
- 计算机组装课的评课记录,听课反思信息技术课堂教学心得体会
- 【Lucene】Lucene的使用和优化
- mvc html validator,ASP.NET MVC实现Validation验证器扩展
- WPF开源控件扩展库 - MaterialDesignExtensions
- 哪个读书app可以导入txt_QQ阅读iphone版怎么导入电子书 三种手机QQ阅读器导入本地图书图文教程...
- 96KB存储器的怎么算地址范围_产品条码怎么申请费用
- ECCV 2020 GigaVision挑战赛“行人和车辆检测”和“多目标追踪”冠军方案解读
- 栈的应用(进制转换)
- matlab中的低通freqs,matlab数字低通滤波器 MATLAB一阶低通滤波器的设计
- 计算机科学导论第5版ppt,计算机科学导论第5讲-1.ppt
- sqlite3数据存储最多存储多少条数据?达到上限如何处理?_把 14 亿人拉到一个微信群,如何实现?...
- 计算机网络八大性能指标
- 如何在Windows上启用JavaScript
- v4手游服务器维护,v4手游每日必做事项分享
- 使用Java导出Excel表格并由浏览器直接下载——基于POI框架
- Qt面试笔试题问答经验总结
- 【TeXstudio】【2】一般的图片和表格的表现形式