.net中的4种事务总结
1 SQL事务
sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)
CREATE PROCEDURE dbo.SPTransaction
(
@UpdateID int,
@UpdateValue nchar(50),
@InsertID int,
@InsertValue nchar(50)
)
AS
begin Tran
Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID
insert into Region Values (@InsertID,@InsertValue)
declare @RegionError int
select @RegionError=@@error
if(@RegionError=0)
COMMIT Tran
else
ROLLBACK Tran
GO
/**//// <summary>
/// SQL事务:
/// </summary>
public void SQLTran()
{
SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SPTransaction";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras= new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value = "2";
paras[1].Value = "Update Value1";
paras[2].Value = "6";
paras[3].Value = "Insert Value1";
foreach (SqlParameter para in paras )
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
}
2 ADO.net事务
Ado.net事务可能是大家一般都用的
优点:简单,效率和数据库事务差不多。
缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:
/**//// <summary>
/// 一般的ADO.net 事务
/// </summary>
public void ADONetTran1()
{
SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd = new SqlCommand();
try
{
cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
paras[0].Value = "2";
paras[1].Value = "Update Value12";
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
//开始事务
cmd.Transaction = conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
cmd.CommandType = CommandType.Text;
paras = new SqlParameter[]{
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value = "7";
paras[1].Value = "Insert Value";
cmd.Parameters.Clear();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
cmd.Transaction.Commit();
}
catch
{
//回滚事务
cmd.Transaction.Rollback();
throw;
}
finally
{
conn.Close();
}
}
3 TransactionScope事务
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
优点:实现简单,同时能够自动提升为分布式事务
Demo:
/**//// <summary>
/// TransactionScope事务:可自动提升事务为完全分布式事务的轻型(本地)事务。
/// 使用时要保证MSDTC服务(控制分布事务)是开启的可以使用:net start msdtc命令开启服务;
/// </summary>
public void ADONetTran2()
{
SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd = new SqlCommand();
try
{
using (System.Transactions.TransactionScope ts = new TransactionScope())
{
cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
paras[0].Value = "2";
paras[1].Value = "Update Value12";
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
cmd.CommandType = CommandType.Text;
paras = new SqlParameter[]{
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value = "8";
paras[1].Value = "Insert Value";
cmd.Parameters.Clear();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
ts.Complete();
}
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
4 COM+事务
在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
Demo:
/**//// <summary>
/// COM+事务
/// </summary>
public void ComTran()
{
SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd = new SqlCommand();
ServiceConfig sc = new ServiceConfig();
//指定事务类型
sc.Transaction = TransactionOption.Required;
//设置启动跟踪
sc.TrackingEnabled = true;
//创建一个上下文,该上下文的配置由作为 cfg 参数传递的 ServiceConfig 对象来指定。
//随后,客户端和服务器端的策略均被触发,如同发生了一个方法调用。
//接着,新的上下文被推至上下文堆栈,成为当前上下文
ServiceDomain.Enter(sc);
try
{
cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
paras[0].Value = "2";
paras[1].Value = "Update Value22";
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
cmd.CommandType = CommandType.Text;
paras = new SqlParameter[]{
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value = "9";
paras[1].Value = "Insert Value";
cmd.Parameters.Clear();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
ContextUtil.SetComplete();
}
catch
{
//回滚事务
ContextUtil.SetAbort();
throw;
}
finally
{
conn.Close();
//触发服务器端的策略,随后触发客户端的策略,如同一个方法调用正在返回。
//然后,当前上下文被弹出上下文堆栈,调用 Enter 时正在运行的上下文成为当前的上下文。
ServiceDomain.Leave();
}
}
在.net中还有些也能进行事务处理,如web Service中
需要特别补充的是:
如果你使用的是分布事务(TransactionScope事务和COM+事务),在默认情况下你是要重新配置安装SQL Server数据库服务器和访问数据库的客户端的.(如果没有配置运行会出现以下错误:该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
)下面是MSDN上关于配置分布式事务的一段原话:
配置分布式事务
要启用分布式事务,可能需要通过网络启用 MS DTC,以便在使用应用了最新的 Service Pack 的较新操作系统(例如 Windows XP 或 Windows 2003)时使用分布式事务。如果启用了 Windows 防火墙(Windows XP Service Pack 2 的默认设置),必须允许 MS DTC 服务使用网络或打开 MS DTC 端口。
实际怎么配置呢,经过我的实际使用:大致如下:打开'控制面板'->'管理工具'->'组件服务',点开'组件服务'->'计算机'->'我的电脑',在'我的电脑'上右击属性,点'MSDTC',然后点'安全性配置'。作为数据库的服务器的配置如下:
而访问数据库的客户端的配置和服务器端的稍有些差别:
在设置完上面的还有使防火墙MS DTC 服务使用网络或打开 MS DTC 端口:运行netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable命令就可以了
转载于:https://www.cnblogs.com/ruinet/archive/2007/07/15/818604.html
.net中的4种事务总结相关推荐
- Spring中七种事务传播行为
事务的传播行为,默认值为 Propagation.REQUIRED.可手动指定事务传播行为,如下: 1.Propagation.REQUIRED 1)若嵌套在事务中,则加入该事务. 2)若没有嵌套在事 ...
- 4种事务特性,5种隔离级别,7种传播行为
去面试,面试官问,说一下spring事务的几种隔离级别,你项目用的是哪个.一脸茫然,之后...... 什么是事务? 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务 ...
- 聊聊 Linux 中的五种 IO 模型
聊聊 Linux 中的五种 IO 模型 2016/04/21 · IT技术 · 8 评论 · iO, 同步, 异步, 阻塞, 非阻塞 分享到:0 本文作者: 伯乐在线 - 陶邦仁 .未经作者许可,禁止 ...
- 面试官:你知道哪几种事务失效的场景?
前言 声明式事务是Spring功能中最爽之一,可是有些时候,我们在使用声明式事务并未生效,这是为什么呢? 今天陈某带大家来聊一聊声明事务的几种失效场景.本文将会从以下两个方面来说一下事务为什么会失效? ...
- 04-JDBC学习手册:JDBC中使用transaction(事务)编程和Javabean定义
JDBC中使用 Transaction(事务)编程 1 事务的四大特性 事务是具备以下特征(ACID) 的工作单元: (1) 原子性 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所 ...
- MySQL-InnoDB究竟如何巧妙实现,4种事务的隔离级别
事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...
- 浅谈MySQL数据库中的锁与事务
MySQL中的锁与锁策略 在MySQL中,为了应对并发场景下的读写,锁通常分为两类:共享锁以及排他锁.其中,共享锁允许多个连接在同一时间并发的读取相同的资源,彼此之间互不影响,所以又称为读锁.排他锁则 ...
- spring 七种事务
七种事务类型: 1.propagation_required:支持当前事务,无事务,另起新事物 2.propagation_required-new:新建事务,若有旧事务,挂起. 3.propagat ...
- mysql四种事务隔离级别
mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...
最新文章
- Linux 静态库 动态库
- 模拟进程创建、终止、阻塞、唤醒原语_操作系统基础8-进程及进程控制
- Redis工作笔记-Sorted-Sets类型
- 基于javaweb+jsp+mysql的美容院管理系统
- 提取字符串中字母数字方法
- LINUX加载静态库so,取得函数地址并调用
- 20191124每日一句
- XPS查看器(XPS Viewer)适用Win10系统安装说明
- 完成类似百度贴吧客户端tableview滑动效果
- android 标签云圆形,JavaScript实现的圆形浮动标签云效果实例
- python 拼音输入法_隐马尔科夫模型python实现简单拼音输入法
- android水下气泡,科学网—水下爆炸气泡的基本现象及规律 - 黄超的博文
- Android手机应用开发之手机GPS定位
- 《雍正皇帝》文化专有词翻译策略的研究现状(Baker)
- 服务器端测试常用linux命令
- rust油桶用什么打_文明重启油桶获取使用攻略_文明重启油桶怎么获取和使用_玩游戏网...
- 数字地图制作原则细节
- DC/DC电路自举电容作用
- Java 集合深入理解(10):Deque 双端队列
- 微信小游戏云开发数据库
热门文章
- 【机器学习】SVM学习(三):线性分类器的求解
- 机器学习知识点(三十六)分类器性能度量指标f1-score
- 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七
- Python入门IDE选择
- Windows 7 下直接硬盘安装 Ubuntu 10.04成为双系统的方法
- Java基础类库四则运算_00JAVA语法基础_四则运算 01
- Dwg图纸属性的读取
- Python 技术篇-不使用os模块遍历文件夹,pathlib库获取直接下级文件和所有下级文件
- DbVisualizer Personal 7.0 数据库连接工具免安装版本获取,直接解压即可使用!
- windows 技术篇-判断某个ip地址相对于自己的主机是内网ip还是外网ip实例演示