博客.学

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
代码
数据库层事务:效果最佳

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


2 ADO.net事务 SqlTransaction
Ado.net事务可能是大家一般都用的
优点:简单,效率和数据库事务差不多。
缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:

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.Transaction
= conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();
cmd.Transaction.Rollback();


3 TransactionScope事务
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
优点:实现简单,同时能够自动提升为分布式事务
Demo:
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();
using (System.Transactions.TransactionScope ts = new TransactionScope())
{
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
ts.Complete();
}


4 COM+事务
在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM
+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
Demo:

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);
cmd.ExecuteNonQuery();
//提交事务
ContextUtil.SetComplete();
ContextUtil.SetAbort();
ServiceDomain.Leave();


ContextUtil事务处理可以关联PageLoad里面的
AbortTransaction
+= new System.EventHandler(AbortTransactionEvent);
CommitTransaction
+= new System.EventHandler(CommitTransactionEvent);

-----------------------------------------------------------------------------

虽然.NET
2.0对事务提供了很好的支持,但是没有必要总是使用事务。使用事务的第一条规则是,在能够使用事务的时候都应该使用事务,但是不要使用过度。原因在于,每次使用事务,都会占用一定的开销。另外,事务可能会锁定一些表的行。还有一条规则是,只有当操作需要的时候才使用事务。例如,如果只是从数据库中查询一些记录,或者执行单个查询,在大部分时候都不需要使用显式事务。

开发人员应该在头脑中始终保持一个概念,就是用于修改多个不同表数据的冗长事务会严重妨碍系统中的所有其他用户。这很可能导致一些性能问题。当实现一个事务时,遵循下面的实践经验能够达到可接受的结果:(
1)避免使用在事务中的SELECT返回数据,除非语句依赖于返回数据;(2)如果使用SELECT语句,只选择需要的行,这样不会锁定过多的资源,而尽可能的提高性能;(3)尽量将事务全部写在T-SQL或者API中;(4)避免事务与多重独立的批处理工作结合,应该将这些批处理放置在单独的事务中;(5)尽可能避免大量更新。
另外,必须注意的一点就是事务的默认行为。在默认情况下,如果没有显式的提交事务,则事务会回滚。虽然默认行为允许事务的回滚,但是显式回滚方法总是一个良好的编程习惯。这不仅仅只是释放锁定数据,也将使得代码更容易读并且更少错误。

-----------------------------------------------------------------------------

 

posted on 2010-09-11 12:08  峰。  阅读(214)  评论(0编辑  收藏  举报