c#事务的使用、示例及注意事项

一、事务的介绍
.NET Framework 开发员指南
事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。
例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。
在 ADO.NET 中,可以使用 Connection 和 Transaction 对象来控制事务。可以使用 Connection.BeginTransaction 启动本地事务。一旦开始一个事务,就可以使用 Command 对象的 Transaction 属性在该事务中登记命令。然后,可以根据事务组件的成功或失败情况,使用 Transaction 对象提交或回滚在数据源中所做的修改。
还可以使用 Connection.EnlistDistributedTransaction 在现有的分布式事务中登记。在现有的分布式事务中登记可以确保当提交或回滚整个分布式事务时,也提交或回滚对数据源所作的代码修改。
以下示例创建一个 OleDbConnection 和一个 OleDbTransaction。它还演示了如何使用 BeginTransaction、Commit 和 Rollback 方法。

 

ExpandedBlockStart.gif代码
public void RunOleDbTransaction(string myConnString)
{
OleDbConnection myConnection 
= new OleDbConnection(myConnString);
myConnection.Open();
OleDbCommand myCommand 
= myConnection.CreateCommand();
OleDbTransaction myTrans;

// Start a local transaction
myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
// Assign transaction object for a pending local transaction
myCommand.Connection = myConnection;
myCommand.Transaction 
= myTrans;
try
{
myCommand.CommandText 
= \"Insert into Region (RegionID, RegionDescription) VALUES (100, \'Description\')\";
myCommand.ExecuteNonQuery();
myCommand.CommandText 
= \"Insert into Region (RegionID, RegionDescription) VALUES (101, \'Description\')\";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine(\
"Both records are written to database.\");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (OleDbException ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine(\
"An exception of type \" + ex.GetType() +
\
" was encountered while attempting to roll back the transaction.\");
}
}

Console.WriteLine(\
"An exception of type \" + e.GetType() +
\
" was encountered while inserting the data.\");
Console.WriteLine(\
"Neither record was written to database.\");
}
finally 
{
myConnection.Close();
}
}

 

OleDbTransaction.Commit 方法
提交数据库事务。
public virtual void Commit();
OleDbTransaction.Rollback 方法
从挂起状态回滚事务。
public virtual void Rollback();
OleDbConnection.BeginTransaction 方法
开始数据库事务。
public OleDbTransaction BeginTransaction();
以当前的 IsolationLevel 值开始数据库事务。
public OleDbTransaction BeginTransaction(IsolationLevel);
IsolationLevel 枚举?
指定连接的事务锁定行为。 在执行事务时,.NET Framework 数据提供程序使用 IsolationLevel 值。在显式更改之前,IsolationLevel 保持有效,但是可以随时对它进行更改。新值在执行时使用,而不是在分析时使用。如果在事务期间更改,服务器的预期行为是,对其余所有语句应用新的锁定级别。
IsolationLevel成员 ReadCommitted
在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
OleDbConnection.CreateCommand 方法
创建和返回一个与 OleDbConnection 相关联的 OleDbCommand 对象。
public OleDbCommand CreateCommand();
OleDbCommand.Connection 属性
获取或设置 OleDbCommand 的此实例使用的 OleDbConnection。
public OleDbConnection Connection {get; set;}


如何在.NET中实现事务(1)
 
如何在.NET中实现事务机制呢? 通常可以使用2种方式: 直接写入到sql 中;使用ADO.NET 实现。下面依次作一下介绍:
方法1:直接写入到sql 中
使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现:
例如
BEGIN TRANS
DECLARE @orderDetailsError int, @productError int
DELETE FROM \"Order Details\" WHERE ProductID=42
SELECT @orderDetailsError = @@ERROR
DELETE FROM Products WHERE ProductID=42
SELECT @productError = @@ERROR
IF @orderDetailsError = 0 AND @productError = 0
COMMIT TRANS
ELSE
ROLLBACK TRANS
这种方法比较简单,具体可以查阅相关sql server 帮助

方法2 :使用ADO.NET 实现,使用这种方式的优点是可以在中间层来管理事务,当然你也可以选择在数据层来实现。
SqlConnection 和OleDbConnection 对象有一个 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 对象。而且这个对象有 Commit 和 Rollback 方法来管理事务,具体例子如下:

cnNorthwind.Open()
Dim trans As SqlTransaction = cnNorthwind.BeginTransaction()
Dim cmDel As New SqlCommand()
cmDel.Connection = cnNorthwind
cmDel.Transaction = trans

Try
cmDel.CommandText = _
\"DELETE [Order Details] WHERE ProductID = 42\"
cmDel.ExecuteNonQuery()
cmDel.CommandText = \"DELETE Products WHERE ProductID = 42\"
cmDel.ExecuteNonQuery()
trans.Commit()

Catch Xcp As Exception
trans.Rollback()
Finally
cnNorthwind.Close()
End Try

Ok,通过上面的例子可以实现与方法1同样的效果。

并发问题:

如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。并发问题包括: 丢失或覆盖更新,未确认的相关性(脏读),不一致的分析(非重复读),幻像读。但是如何来避免数据读取时脏读等问题出现呢?
 
二、事务实例

using(SqlTransaction trans = conn.BeginTransaction())
{
  
try
  {
 
//循环进行信息的插入
 for(int count = 0; count < applyInfo.Length; count ++)
 {
   
//声明参数并赋值
   SqlParameter[] parms = 
{ Database.MakeInParam (\
"@Stu_ID\",System.Data.SqlDbType.VarChar,11,applyInfocount].StuID),
Database.MakeInParam\
"@Bank_Name\",System.Data.SqlDbType.VarChar,50,applyInfo[count].BankName),  Database.MakeInParam\"@Apply_Loan_Money\",System.Data.SqlDbType.Money,8,applyInfo[count].ApplyLoanMoney), Database.MakeInParam(\"@Apply_Loan_Year\",System.Data.SqlDbType.VarChar,20,applyInfo[count].ApplyLoanYear),  Database.MakeInParam\"@Apply_Year\",System.Data.SqlDbType.Char,6,applyInfo[count].ApplyYear),       Database.MakeInParam(\"@Apply_Length\",System.Data.SqlDbType.Int,4,applyInfo[count].ApplyLength),       Database.MakeInParam(\"@Apply_Pass\",System.Data.SqlDbType.Char,1,applyInfo[count].ApplyPass),
Database.MakeInParam(\
"@Apply_Remark\",System.Data.SqlDbType.VarChar,100,applyInfo[count].ApplyRemark)
        };
  
//执行新增操作
  SqlHelper.ExecuteNonQuery(trans,CommandType.StoredProcedure, \"ApplyInfo_Create\", parms);
}
      
//未出现错误,则提交事务
   trans.Commit();
   
return true;
   }
       
catch(Exception ex)
   {
  
//出错则回滚
  trans.Rollback();
  
throw ex;
       }
 }

 

四、注意事项
  事务的定义必须在连接打开后,提交必须在关闭以前
  使用事务时必须即是把事务添加到sqlCommand中去。

转载于:https://www.cnblogs.com/hayden/archive/2010/01/28/1658114.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx学习系列二Linux下Nginx实现负载均衡

关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1、启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限需要),接着找到Nginx的安装目录,启动Nginx,并且指定Nginx启动所需的配置文件,该文件也在Nginx的安装目录下. 2、查看…

设计模式初学者系列-策略模式 -------为什么总是继承

设计模式初学者系列&#xff0d;策略模式 -------为什么总是继承 模板方法的延续 这篇稿子是基于我的前一篇模板方法设计模式之上演绎的&#xff0c;如果没有阅读请点击这里查看&#xff0c;以了解这篇稿子的上下文。 在模板方法设计模式里我举了一个例子&#xff1a;教育部…

红米airdots掉了怎么查找_红米K30 Pro 荣耀V30pro 这两款手机该怎么选呢?

点击?玩机数码君?关注我&#xff0c;加★星标★你好 我是岁月神偷昨天可以说是小米拍手称快的一天&#xff0c;红米K30 Pro以2999的超低价成为目前最便宜的骁龙865旗舰&#xff0c;让友商拍马难追。友商明眼人都知道说的华为&#xff0c;怎么感觉小米每次发布会也替华为宣传了…

返回一个循环整数组最大子数组和

任务要求&#xff1a; 1、输入一个整形数组&#xff0c;数组里有正数也有负数。 2、数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和。 3、如果数组A[0]……A[j-1]首尾相邻&#xff0c;允许A[i-1]&#xff0c; …… A[n-1]&#xff0c; A[0]……A…

4K 海思 联咏 芯片_老电视也有春天,换装海美迪4K电视盒子H7 Plus

写在前面YALL&#xff0c;大家好&#xff0c;我是老炮儿许老板。疫情进入六月逐渐好转&#xff0c;各级各类学校相继开学&#xff0c;年前给儿子报的托班也终于迎来了开学&#xff0c;平日里帮忙照看儿子的爷爷奶奶也终于得到了解放。现在白天有大把大把的时间来追剧看电视&…

WCF从理论到实践(4):路在何方

本文的出发点 通过阅读本文&#xff0c;您能了解以下知识&#xff1a; Address是什么&#xff1f; Address的组成&#xff1f; 如何在配置文件中指定Address? 如何通过编程方式设置Address? Address有什么特殊应用&#xff1f; 本文适合的读者 适合WCF初学者&#xff…

office 2007图标_微软Office 365桌面版新图标开始测试

IT之家3月1日消息 此前&#xff0c;微软公布了全新的Office图标&#xff0c;微软Office 365在线网页版在2月15日开始已经全面更新新版图标&#xff0c;而桌面版Office 365现在也陆续开始测试新版图标。目前微软Office Dogfood通道上推送的开发者预览版本已经在2月27日开始测试O…

【动态规划BFS】相遇

这是我第一次模拟题测试点全部AC。。。 同机房的DALAO都用的BFS 然而我用的DP&#xff08;其实不会BFS&#xff09; 话不多说&#xff0c;上题&#xff01; &#xff08;灰常详细&#xff09;DP解法&#xff1a; 重点还是状态转移方程式的推导 1个点i要么是后面的位置i-1往前走…

五个思路,教你如何建立金融业的数据分析管理模型

说起银行、保险、股票投资这样的金融行业&#xff0c;很多人都认为它们是依靠数据驱动的企业&#xff0c;毕竟大数据的诞生本来就是为了金融信息流通而服务的&#xff0c;但在我身边很多搞证券、投资的朋友看来&#xff0c;事实却并非如此。 真正在金融行业做数据分析的人&…

【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题

购物车这一块还剩最后两个问题&#xff0c;就是订单信息的级联入库和页面缓存&#xff0c;这里的信息是指购物车和购物项&#xff0c;即我们将购物车的信息存入数据库的同时&#xff0c;也存入每个购物项的信息&#xff0c;而且外键都关联好&#xff0c;这涉及到了Hibernate中的…

exfat分配单元大小选多少_安防监控摄像机视角大小和镜头毫米数的基础知识!...

关于选择监控镜头毫米数的问题&#xff0c;虽然只有新手才有此困惑&#xff0c;但是我们还是要认真地说一说。监控视角&#xff0c;就是指监控照射的镜头所能覆盖到的范围&#xff0c;就是监控画面所能看到的角度统称叫监控视角。我们正常选购监控的时候&#xff0c;除了可以选…

彩信编辑器之预览功能

html代码 <table width"200"height"250"border"0"cellpadding"0"cellspacing"0"bgcolor"#666666"><tr><td align"center"valign"middle"><marquee id"MMScreen&qu…

java 几个实用的小工具

1、除法运算 编程的人都知道&#xff0c;java中的“/”、“%”运算&#xff0c;其中前者为取整&#xff0c;后者取余数。那么有没有快捷的运算方法取正常的运算结果呢&#xff1f; 查了资料&#xff0c;发现很简单。代码如下&#xff1a; public static String txfloat(int a,i…

动画演示 Delphi 2007 IDE 功能[3] - 修改属性

动画剧本:添加控件后用 F11 激活 Object Inspector 窗口;可用 ↑ ↓ 选择属性;用 Tab 切换属性名和属性值;用 Tab 切换到属性名后, 键入属性名的部分字母, 可迅速定位;用 Tab 切换到属性值后, 也可以键入字母选择, 而后回车确认.Ctrl↓ 可以选择其他控件;整个过程可以做到无鼠标…

kali怎么成为管理员_网站死链是什么、是怎么引起的以及死链对SEO优化的影响?...

网站死链是我们在做SEO时必不可少的一个错误&#xff0c;对于从事SEO行业的人员来说&#xff0c;网站死链最熟悉不过了&#xff0c;但是对于那些刚入SEO行业的新手来说&#xff0c;还是不太熟悉。今天我们就给大家讲一下什么是网站死链&#xff1f;网站死链是怎么引起的&#x…

Map-Reduce入门

1、Map-Reduce的逻辑过程 假设我们需要处理一批有关天气的数据&#xff0c;其格式如下&#xff1a; 按照ASCII码存储&#xff0c;每行一条记录每一行字符从0开始计数&#xff0c;第15个到第18个字符为年第25个到第29个字符为温度&#xff0c;其中第25位是符号/-006701199099999…

clickhouse大数据分析技术与实战_从销售到经营——大客户销售策略与实战技术...

对于首席客户代表而言&#xff0c;要走出困局&#xff0c;所需要大客户销售策略性的训练&#xff0c;而不是像基层客户经理的销售技巧训练一样&#xff1b;新业务的学习固然重要&#xff0c;但更重要的是转化成实战绩效。从组织变革角度&#xff0c;每次成功的业务转型背后都意…

Acer 4750 安装黑苹果_黑苹果系统安装通用教程图文版

在开始之前&#xff0c;不管你要安装的是台式组装机&#xff0c;台式品牌机&#xff0c;一体机&#xff0c;还是笔记本&#xff0c;都要大概了解一下硬件信息。因为黑苹果的安装确实比安装Windows的系统要复杂的多。不管是前期准备工作&#xff0c;安装&#xff0c;还是安装之后…

mysql 快速生成百万条测试数据

转自&#xff1a;http://www.cnblogs.com/jiangxiaobo/p/6101072.html 1、生成思路 利用mysql内存表插入速度快的特点&#xff0c;先利用函数和存储过程在内存表中生成数据&#xff0c;然后再从内存表插入普通表中2、创建内存表及普通表 CREATE TABLE vote_record_memory (id I…

java JVM

每一个Java虚拟机都由一个类加载器子系统&#xff08;class loader subsystem&#xff09;&#xff0c;负责加载程序中的类型&#xff08;类和接口&#xff09;&#xff0c;并赋予唯一的名字。每一个Java虚拟机都有一个执行引擎&#xff08;execution engine&#xff09;负责执…