.NET的事务处理(转)
2016-06-19 18:57
555 查看
1、SQL事务
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
[sql] view
plaincopy
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
[sql] view
plain copy
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、ADO.NET 事务
在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
调用Connection 对象的BeginTransaction 方法来标记事务的开始。
将Transaction 对象分配给要执行的Command的Transaction 属性。
执行所需的命令。
调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。
优点:简单,效率和数据库事务差不多快。
缺点:事务执行在数据库连接层上,所以你需要在事务过程中手动的维护一个连接。
[csharp] view
plaincopy
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);
conn.Open();
SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = tx;
try
{
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
tx.Commit();
}
catch (Exception ex)
{
tx.Rollback();
throw new Exception(ex.Message, ex);
}
finally
{
conn.Close();
}
[csharp] view
plain copy
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);
conn.Open();
SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = tx;
try
{
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
tx.Commit();
}
catch (Exception ex)
{
tx.Rollback();
throw new Exception(ex.Message, ex);
}
finally
{
conn.Close();
}
3、TransactionScope事务
在.NET 2.0中新添加了一个名为System.Transactions的命名空间,其提供了一个“轻量级”的、易于使用的事务框架,通过这个框架可以大大简化事务的操作。
这个框架提供了如下优点:
(1)在简单(不涉及分布式)事务中也可以使用声明式的事务处理方法,而不必使用Com+容器和目录注册。
(2)用户根本不需要考虑是简单事务还是分布式事务。它实现一种所谓自动提升事务机制(Promotable Transaction),会自动根据事务中涉及的对象资源判断使用何种事务管理器。
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
优点:实现简单,同时能够自动提升为分布式事务
[csharp] view
plaincopy
TransactionOptions option = new TransactionOptions();
option.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
}
ts.Complete();
}
[csharp] view
plain copy
TransactionOptions option = new TransactionOptions();
option.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
}
ts.Complete();
}
4、EnterpriseServices实现事务
就是利用com+实现自动处理事务。
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;
使用方法参考:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;816141
随便建立一个按钮,在按钮中进行如下操作:
[csharp] view
plaincopy
try
{
work1();
work2();
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}
[csharp] view
plain copy
try
{
work1();
work2();
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}
然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况 :
[html] view
plaincopy
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" 即可
别人转的没有地址。。。。
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
[sql] view
plaincopy
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
[sql] view
plain copy
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、ADO.NET 事务
在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
调用Connection 对象的BeginTransaction 方法来标记事务的开始。
将Transaction 对象分配给要执行的Command的Transaction 属性。
执行所需的命令。
调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。
优点:简单,效率和数据库事务差不多快。
缺点:事务执行在数据库连接层上,所以你需要在事务过程中手动的维护一个连接。
[csharp] view
plaincopy
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);
conn.Open();
SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = tx;
try
{
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
tx.Commit();
}
catch (Exception ex)
{
tx.Rollback();
throw new Exception(ex.Message, ex);
}
finally
{
conn.Close();
}
[csharp] view
plain copy
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);
conn.Open();
SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = tx;
try
{
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
tx.Commit();
}
catch (Exception ex)
{
tx.Rollback();
throw new Exception(ex.Message, ex);
}
finally
{
conn.Close();
}
3、TransactionScope事务
在.NET 2.0中新添加了一个名为System.Transactions的命名空间,其提供了一个“轻量级”的、易于使用的事务框架,通过这个框架可以大大简化事务的操作。
这个框架提供了如下优点:
(1)在简单(不涉及分布式)事务中也可以使用声明式的事务处理方法,而不必使用Com+容器和目录注册。
(2)用户根本不需要考虑是简单事务还是分布式事务。它实现一种所谓自动提升事务机制(Promotable Transaction),会自动根据事务中涉及的对象资源判断使用何种事务管理器。
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
优点:实现简单,同时能够自动提升为分布式事务
[csharp] view
plaincopy
TransactionOptions option = new TransactionOptions();
option.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
}
ts.Complete();
}
[csharp] view
plain copy
TransactionOptions option = new TransactionOptions();
option.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";
cmd.ExecuteNonQuery();
}
ts.Complete();
}
4、EnterpriseServices实现事务
就是利用com+实现自动处理事务。
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;
使用方法参考:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;816141
随便建立一个按钮,在按钮中进行如下操作:
[csharp] view
plaincopy
try
{
work1();
work2();
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}
[csharp] view
plain copy
try
{
work1();
work2();
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}
然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况 :
[html] view
plaincopy
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" 即可
别人转的没有地址。。。。
相关文章推荐
- 如何在 Linux/Windows/MacOS 上使用 .NET 进行开发
- c#调用COM组件
- 如何在 Linux 中安装微软的 .NET Core SDK
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- RabbitMQ入门与使用篇 推荐