在web开发中的三个层次使用事务(C#编程)
2007-11-23 20:23
525 查看
很多数据库操作需要进行事务,Asp.net下面进行事务大致有3个层次:
(1)存储过程层次的事务
(2)Ado.Net层次的事务
(3)Asp.Net页面层次的事务
下面分别举例:
首先建立trantest表,字段id(int),test(char)
为id设置主键(利用主键是不允许重复的特性进行事务测试)
假设数据库内存在记录id=1,test='test'
(1)
CREATE PROCEDURE Tran1
as
begin tran
set xact_abort on
Insert Into trantest (id,test)values(1,'test')
Insert Into trantest (id,test)values(2,'test')
commit tran
GO
set xact_abort on 表示遇到错误立即回滚
当然你也可以这么写
CREATE PROCEDURE tran1
as
begin tran
insert into trantest(id,test)values(1,'test')
if(@@error<>0)
rollback tran
else
begin
insert into trantest(id,test)values(2,'test')
if(@@error<>0)
rollback tran
else
commit tran
end
GO
(2)
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
conn.Open();
SqlTransaction tran=conn.BeginTransaction();
cmd1.Transaction=tran;
cmd2.Transaction=tran;
try
{
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
tran.Commit();
}
catch(SqlException except)
{
tran.Rollback();
Response.Write(except.Message);
}
finally
{
conn.Close();
}
(3)
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;
随便建立一个按钮,在按钮中进行如下操作:
try
{
work1();
work2();
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}
然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况
private void work1()
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
}
private void work2()
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);
conn.Open();
cmd2.ExecuteNonQuery();
conn.Close();
}
修改前台页面在<%Page后面添加 Transaction="Required" 即可
以上是我个人在实际工作中总结的一些经验,好不好还需要大家的评论了,其中如有不足的地方,还希望大家能帮我指出.
(1)存储过程层次的事务
(2)Ado.Net层次的事务
(3)Asp.Net页面层次的事务
下面分别举例:
首先建立trantest表,字段id(int),test(char)
为id设置主键(利用主键是不允许重复的特性进行事务测试)
假设数据库内存在记录id=1,test='test'
(1)
CREATE PROCEDURE Tran1
as
begin tran
set xact_abort on
Insert Into trantest (id,test)values(1,'test')
Insert Into trantest (id,test)values(2,'test')
commit tran
GO
set xact_abort on 表示遇到错误立即回滚
当然你也可以这么写
CREATE PROCEDURE tran1
as
begin tran
insert into trantest(id,test)values(1,'test')
if(@@error<>0)
rollback tran
else
begin
insert into trantest(id,test)values(2,'test')
if(@@error<>0)
rollback tran
else
commit tran
end
GO
(2)
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
conn.Open();
SqlTransaction tran=conn.BeginTransaction();
cmd1.Transaction=tran;
cmd2.Transaction=tran;
try
{
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
tran.Commit();
}
catch(SqlException except)
{
tran.Rollback();
Response.Write(except.Message);
}
finally
{
conn.Close();
}
(3)
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;
随便建立一个按钮,在按钮中进行如下操作:
try
{
work1();
work2();
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}
然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况
private void work1()
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
}
private void work2()
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);
conn.Open();
cmd2.ExecuteNonQuery();
conn.Close();
}
修改前台页面在<%Page后面添加 Transaction="Required" 即可
以上是我个人在实际工作中总结的一些经验,好不好还需要大家的评论了,其中如有不足的地方,还希望大家能帮我指出.
相关文章推荐
- 在web开发中的三个层次使用事务(C#编程)(转)
- 在web开发中的三个层次使用事务
- 在web开发中的三个层次使用事务
- 求救: 在web开发中的三个层次使用事务之COM+不能使用,请各位指点
- (原创)在web开发中的三个层次使用事务
- 昨日关注:在web开发中的三个层次使用事务
- C#开发移动应用系列(2.使用WebView搭建WebApp应用)
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- 使用C#开发ActiveX控件,并打包cab应用于web
- C#脱离Halcon编程开发环境使用方法
- 用C#开发ActiveX控件,并使用web调用
- 使用C#创建webservice及三种调用方式 (ASP.NETweb编程常用到的27个函数集)
- 简单介绍使用WCF的Web编程模型开发REST风格的Web Service
- 学习使用J2EE Web应用的事件功能-Java基础-Java-编程开发
- 【Android开发】网路编程及Internet应用-使用WebView显示网页
- 使用Facebook C# SDK开发facebook web app(入门及一些资源)
- C#编程开发 Berkeley DB SQL使用方法
- web开发下的HTTP编程及接口回调的使用
- log4net在C# web开发中的使用(MVC)
- JAVAWEB开发之事务详解(mysql与JDBC下使用方法、事务的特性、锁机制)和连接池的详细使用(dbcp以c3p0)