使用Ado.Net进行简单事务处理的四种实现及比较
2006-10-24 11:54
1206 查看
一:处理方法和示例代码
代码说明:
Test1为一个简单的数据库表,有两个字段,id为整型是非空关键字;name为字符型。已初始化记录一条(1,’1’);
先在需要在Test中插入两条记录,一个为(10,’10’);一个为(1,’10’);如果其中一个失败便回滚。由于第二条肯定会失败,所以如果事务处理成功,结果是Test1之中最后仍只有一条id为1的记录。
//数据库手动事务处理方法一:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
myConn1.Open();
SqlTransaction myTrans1 = myConn1.BeginTransaction();
SqlCommand myComm1 = new SqlCommand("insert into test1 values(10,'10')",myConn1);
myComm1.Transaction = myTrans1;
try
{
int ret = myComm1.ExecuteNonQuery();
if(ret != 1)
throw new ApplicationException("");
myComm1.CommandText = "insert into test1 values (1,'1')";
ret = myComm1.ExecuteNonQuery();
if(ret != 1)
throw new ApplicationException("");
myTrans1.Commit();
}
catch(Exception ex)
{
myTrans1.Rollback();
}
finally
{
myConn1.Close();
}
//数据库手动事务处理方法二:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
myConn1.Open();
SqlTransaction myTrans1 = myConn1.BeginTransaction();
SqlCommand myComm1 = new SqlCommand("insert into test1 values (10,'10')\r\ninsert into test1 values (1,'10')",myConn1);
myComm1.Transaction = myTrans1;
try
{
int ret = myComm1.ExecuteNonQuery();
if(ret != 2)
throw new Exception("");
myTrans1.Commit();
}
catch(Exception ex)
{
myTrans1.Rollback();
}
finally
{
myConn1.Close();
}
//数据库手动事务处理方法三:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
myConn1.Open();
SqlTransaction myTrans1 = myConn1.BeginTransaction();
string sql = @"begin tran
insert into test1 values(10,'10')
if (@@rowcount <> 1)
begin
rollback tran
return
end
insert into test1 values(1,'10')
if @@rowcount <> 1
begin
rollback tran
return
end
commit tran";
SqlCommand myComm1 = new SqlCommand(sql,myConn1);
myComm1.Transaction = myTrans1;
try
{
myComm1.ExecuteNonQuery();
myTrans1.Commit();
}
catch(Exception ex)
{
myTrans1.Rollback();
}
finally
{
myConn1.Close();
}
//数据库手动事务处理方法四:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
string sql = @"InsertProc"; //InsertProc为存储过程,代码同方法三中的SQL
SqlCommand myComm1 = new SqlCommand(sql,myConn1);
myComm1.CommandType = CommandType.StoredProcedure ;
try
{
myConn1.Open();
myComm1.ExecuteNonQuery();
}
catch(Exception ex)
{
//;
}
finally
{
myConn1.Close();
}
上述四种实现代码都可以成功完成该事务处理。
二.方法比较和分析
1. 方法1:
描述:这是较为常见的业务逻辑事务处理方法。把处理过程分为几个子过程;让这几个子过程都关联同一个事务;只要有一个子过程失败了,便回滚。全部子过程成功执行,提交事务。
特点:代码非常“逻辑化”;但数据库往返次数多,且实现与业务绑定很死。
适用:业务逻辑不能通过一条SQL语句或后台存储过程完成;或在每一个子过程执行完后必须进行客户端处理的情况等。
2. 方法二:
描述:这是偷懒的写法,不太常用。如果可以拼凑为一个SQL语句来完成事务处理,也就可以适用后台存储过程做。
特点:代码简单;但数据库一次往返次,业务更改时只修改拼凑的SQL语句。
适用:最好不用。如果是不同数据资源之间的可偶尔用,如乡音卡系统中的发卡操作:发卡时需要先在本地系统数据库中插入一条发卡交易记录;插入一条新发卡信息记录;然后在智能网数据库中修改新卡状态。三个子过程处于同一个事务中,此时可以把操作本地系统数据库中的两个操作拼凑为一个SQL语句,简化执行过程,又保证可以再第三步成功后再提交事务。
3. 方法三:
描述:这是不推荐的写法。原因同2。
特点:利用SQL脚本的事务控制;数据库一次往返,业务更改时只修改拼凑的SQL语句。
适用:最好不用。这种情况推荐适用存储过程完成。但有时候数据库存储过程太多了的时候,为了减轻数据库的负担或者是 第三方的数据库,无法在其数据库中创建存储过程的情况。
4. 方法四:
描述:这也是较为常见的写法。推荐使用。
特点:利用SQL存储过程的事务控制;数据库一次往返,业务更改时只修改后台存储过程;而不用修改代码。
适用:一般可以由后台完成的事务处理情况下都尽量用这种方法。需要注意的是如果存储过程超过一定数量,需要对存储过程的处理代码维护更改记录。
代码说明:
Test1为一个简单的数据库表,有两个字段,id为整型是非空关键字;name为字符型。已初始化记录一条(1,’1’);
先在需要在Test中插入两条记录,一个为(10,’10’);一个为(1,’10’);如果其中一个失败便回滚。由于第二条肯定会失败,所以如果事务处理成功,结果是Test1之中最后仍只有一条id为1的记录。
//数据库手动事务处理方法一:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
myConn1.Open();
SqlTransaction myTrans1 = myConn1.BeginTransaction();
SqlCommand myComm1 = new SqlCommand("insert into test1 values(10,'10')",myConn1);
myComm1.Transaction = myTrans1;
try
{
int ret = myComm1.ExecuteNonQuery();
if(ret != 1)
throw new ApplicationException("");
myComm1.CommandText = "insert into test1 values (1,'1')";
ret = myComm1.ExecuteNonQuery();
if(ret != 1)
throw new ApplicationException("");
myTrans1.Commit();
}
catch(Exception ex)
{
myTrans1.Rollback();
}
finally
{
myConn1.Close();
}
//数据库手动事务处理方法二:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
myConn1.Open();
SqlTransaction myTrans1 = myConn1.BeginTransaction();
SqlCommand myComm1 = new SqlCommand("insert into test1 values (10,'10')\r\ninsert into test1 values (1,'10')",myConn1);
myComm1.Transaction = myTrans1;
try
{
int ret = myComm1.ExecuteNonQuery();
if(ret != 2)
throw new Exception("");
myTrans1.Commit();
}
catch(Exception ex)
{
myTrans1.Rollback();
}
finally
{
myConn1.Close();
}
//数据库手动事务处理方法三:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
myConn1.Open();
SqlTransaction myTrans1 = myConn1.BeginTransaction();
string sql = @"begin tran
insert into test1 values(10,'10')
if (@@rowcount <> 1)
begin
rollback tran
return
end
insert into test1 values(1,'10')
if @@rowcount <> 1
begin
rollback tran
return
end
commit tran";
SqlCommand myComm1 = new SqlCommand(sql,myConn1);
myComm1.Transaction = myTrans1;
try
{
myComm1.ExecuteNonQuery();
myTrans1.Commit();
}
catch(Exception ex)
{
myTrans1.Rollback();
}
finally
{
myConn1.Close();
}
//数据库手动事务处理方法四:
SqlConnection myConn1 = new SqlConnection(Class1.conn1 );
string sql = @"InsertProc"; //InsertProc为存储过程,代码同方法三中的SQL
SqlCommand myComm1 = new SqlCommand(sql,myConn1);
myComm1.CommandType = CommandType.StoredProcedure ;
try
{
myConn1.Open();
myComm1.ExecuteNonQuery();
}
catch(Exception ex)
{
//;
}
finally
{
myConn1.Close();
}
上述四种实现代码都可以成功完成该事务处理。
二.方法比较和分析
1. 方法1:
描述:这是较为常见的业务逻辑事务处理方法。把处理过程分为几个子过程;让这几个子过程都关联同一个事务;只要有一个子过程失败了,便回滚。全部子过程成功执行,提交事务。
特点:代码非常“逻辑化”;但数据库往返次数多,且实现与业务绑定很死。
适用:业务逻辑不能通过一条SQL语句或后台存储过程完成;或在每一个子过程执行完后必须进行客户端处理的情况等。
2. 方法二:
描述:这是偷懒的写法,不太常用。如果可以拼凑为一个SQL语句来完成事务处理,也就可以适用后台存储过程做。
特点:代码简单;但数据库一次往返次,业务更改时只修改拼凑的SQL语句。
适用:最好不用。如果是不同数据资源之间的可偶尔用,如乡音卡系统中的发卡操作:发卡时需要先在本地系统数据库中插入一条发卡交易记录;插入一条新发卡信息记录;然后在智能网数据库中修改新卡状态。三个子过程处于同一个事务中,此时可以把操作本地系统数据库中的两个操作拼凑为一个SQL语句,简化执行过程,又保证可以再第三步成功后再提交事务。
3. 方法三:
描述:这是不推荐的写法。原因同2。
特点:利用SQL脚本的事务控制;数据库一次往返,业务更改时只修改拼凑的SQL语句。
适用:最好不用。这种情况推荐适用存储过程完成。但有时候数据库存储过程太多了的时候,为了减轻数据库的负担或者是 第三方的数据库,无法在其数据库中创建存储过程的情况。
4. 方法四:
描述:这也是较为常见的写法。推荐使用。
特点:利用SQL存储过程的事务控制;数据库一次往返,业务更改时只修改后台存储过程;而不用修改代码。
适用:一般可以由后台完成的事务处理情况下都尽量用这种方法。需要注意的是如果存储过程超过一定数量,需要对存储过程的处理代码维护更改记录。
相关文章推荐
- 使用ADO.NET 实现事务处理
- 使用ADO.NET 实现事务处理
- ROS学习笔记(2):在ROS中使用OpenCV进行简单的图像处理---代码实现篇
- asp.net- ajax简单入门使用方法,通过一般处理程序ashx进行处理
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-UDA中处理事务
- ADO.NET中实现事务处理
- 使用ADO.NET配置SQL Server事务处理
- 使用ADO.NET配置SQLServer事务处理
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-UDA中处理事务
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- 通过ADO.NET实现事务处理
- 使用.NET Framework 进行事务处理
- SqlTransaction、SqlConnection和SqlCommand对象实现ADO.NET事务处理
- 使用ADO.NET配置SQL Server事务处理
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- ADO.NET如何实现分布式事务处理
- 通过ADO.NET实现事务处理
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- [转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法
- 自己写的数据库访问组件 使用ADO.NET 比较简单