.net 中的几种事务
在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。
1 SQL事务
sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)























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




























































1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public static string DBCon = System.Configuration.ConfigurationManager.ConnectionStrings[ "ConnectionString" ].ToString(); public bool Transcation( string sql) { using (SqlConnection connection = new SqlConnection(BLL_Class.DBCon)) { connection.Open(); SqlCommand command = connection.CreateCommand(); SqlTransaction transaction; //启动事务 transaction = connection.BeginTransaction( "SampleTransaction" ); //设定SqlCommand的事务和连接对象 command.Connection = connection; command.Transaction = transaction; try { command.CommandText = sql; command.ExecuteNonQuery(); // 完成提交 transaction.Commit(); return true ; } catch (Exception ex) { //数据回滚 transaction.Rollback(); return false ; } } } |
3 TransactionScope事务
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
优点:实现简单,同时能够自动提升为分布式事务
Demo:






























































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








































































在.net中还有些也能进行事务处理,如web Service中
需要特别补充的是:
如果你使用的是分布事务(TransactionScope事务和COM+事务),在默认情况下你是要重新配置安装SQL Server数据库服务器和访问数据库的客户端的.(如果没有配置运行会出现以下错误:该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
)下面是MSDN上关于配置分布式事务的一段原话:
配置分布式事务
要启用分布式事务,可能需要通过网络启用 MS DTC,以便在使用应用了最新的 Service Pack 的较新操作系统(例如 Windows XP 或 Windows 2003)时使用分布式事务。如果启用了 Windows 防火墙(Windows XP Service Pack 2 的默认设置),必须允许 MS DTC 服务使用网络或打开 MS DTC 端口。
实际怎么配置呢,经过我的实际使用:大致如下:打开'控制面板'->'管理工具'->'组件服务',点开'组件服务'->'计算机'->'我的电脑',在'我的电脑'上右击属性,点'MSDTC',然后点'安全性配置'。作为数据库的服务器的配置如下:
而访问数据库的客户端的配置和服务器端的稍有些差别:
在设置完上面的还有使防火墙MS DTC 服务使用网络或打开 MS DTC 端口:运行netsh firewall set allowedprogram %windir%/system32/msdtc.exe MSDTC enable命令就可以了
ASP.NET中的自动化事务
通过在ASP.NET页面中添加Transaction属性,可使得ASP.NET能够在系统中支持自动事务。利用Transaction属性,开发人员能够指示页面参与现有事务,开始新事务,或者不参与事务。下表列举了ASP.NET中可用的Transaction属性值。
通过在代码中的Page指令中设置Transaction属性能够定义页面支持的事务级别。例如,插入以下指令能够保证页面活动总是在事务范围中执行:
<%@ Page Transaction="Required" %>
如果省略Transaction属性,页面则禁用事务。使用System.EnterpriseServices.ContextUtil类的静态方法在ASP.NET页面中提交或者放弃事务。这些静态方法是SetComplete()和SetAbort()(它们分别对应Page事件CommitTransaction()和AbortTransaction())。以下代码列举了页面实现框架,该页面将Page指令的Transaction属性设置为Required,同时在CommitTransaction()和AbortTransaction()事件中,编写处理事务结果所需的代码。
void Page_Load(object sender, System.EventArgs e)
{
AbortTransaction += new System.EventHandler(AbortTransactionEvent);
CommitTransaction += new System.EventHandler(CommitTransactionEvent);
try
{
/* 在这里放置事务性代码 */
ContextUtil.SetComplete();
}
catch (Exception)
{
ContextUtil.SetAbort();
}
}
void AbortTransactionEvent(object sender, System.EventArgs e)
{
/*用于回滚行为的代码*/
}
void CommitTransactionEvent(object sender, System.EventArgs e)
{
/*用于提交行为的代码*/
}
}
4. 何时使用事务
虽然.NET 2.0对事务提供了很好的支持,但是没有必要总是使用事务。使用事务的第一条规则是,在能够使用事务的时候都应该使用事务,但是不要使用过度。原因在于,每次使用事务,都会占用一定的开销。另外,事务可能会锁定一些表的行。还有一条规则是,只有当操作需要的时候才使用事务。例如,如果只是从数据库中查询一些记录,或者执行单个查询,在大部分时候都不需要使用显式事务。
开发人员应该在头脑中始终保持一个概念,就是用于修改多个不同表数据的冗长事务会严重妨碍系统中的所有其他用户。这很可能导致一些性能问题。当实现一个事务时,遵循下面的实践经验能够达到可接受的结果:(1)避免使用在事务中的SELECT返回数据,除非语句依赖于返回数据;(2)如果使用SELECT语句,只选择需要的行,这样不会锁定过多的资源,而尽可能的提高性能;(3)尽量将事务全部写在T-SQL或者API中;(4)避免事务与多重独立的批处理工作结合,应该将这些批处理放置在单独的事务中;(5)尽可能避免大量更新。
另外,必须注意的一点就是事务的默认行为。在默认情况下,如果没有显式的提交事务,则事务会回滚。虽然默认行为允许事务的回滚,但是显式回滚方法总是一个良好的编程习惯。这不仅仅只是释放锁定数据,也将使得代码更容易读并且更少错误。
转载自:https://www.cnblogs.com/lgx5/p/7899929.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix