ASP.NET事务处理

软件系统设计-事务处理 事务处理是一种数据处理技术,主要用于记录和跟踪软件系统的特定业务活动,确保数据的完整性和一致性。它涉及将多个相关的数据库操作组合成一个单一的逻辑单元,这个单元要么完全执行,要么完全不执行,以确保数据的准确性和系统的稳定性。这种处理方式通常具有ACID属性,即· 原子性(Atomicity):即本次操作的执行过程要么成功,要么失败,不存在中间态,这就是原子性;· 隔离性(Isolation):即本次操作的数据在事务未提交前,不可能被其他操作可见,也不可能访问到其他事务操作的数据; 阅读详情

事务处理简介

1.1什么是事务处理

事务是一组组合成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。

如果在事务过程中没有遇到错误,事物中的所有修改都将永久成为数据库的一部分。

如果遇到错误,则不会对数据库做出任何修改。

1.2事务处理过程

1. 开始一个事务。进入“事物待命”状态。

2. 在“事务待命”状态,记录事务中改变的数据库记录。此改变不能直接改变数据库中的值,必须先用一个顺序的“事务日志”记录在一边。同时,对于要改变的原始记录加锁,让其它用户无法读和写。如果记录已经被其它事务加锁,则报错。

3. 在“事务待命”,如果用户给出commit transaction 命令,则进入“事务拷贝”状态,拷贝所有的加锁的记录成备份。

4. 上面3执行完,则进入“事务更新”状态,用“事务日志”中记录一一更新实际的数据库记录。

5. 上面4执行完,则进入“事务结束”状态,释放所有的记录锁,然后抛弃“事务日志”和备份的原始数据库记录。

6. 上面5做完后,事务被删除。

但是,最为关键的是,事务系统必须执行以下过程:一但数据库由于软件、硬件问题发生故障,重启动后,一旦有事务没有正常删除,则:

7. 如果在“事务待命”、“事务结束”状态,则重新从5中结束事务的动作开始执行。

8.如果在“事务更新”状态,则重新从4开始更新记录,但继续想下执行。结果,虽然系统崩溃过,但事务仍然能正常提交。

1.3事务处理举例

1.4事务处理有关事项

事务处理的关键是在提交事务或者取消事务时,万一系统崩溃了,数据库再次启动时,仍然需要保持数据库逻辑一致性。

应用中包含的事务应当尽量让它“瞬间”完成,避免在比较忙时造成用户进程的互锁。

Informix、Oracle、DB2等数据库德实际事务处理流程更复杂,目的是具有更好的抵抗系统错误性质,因为事务保护是业务系统安全稳定的最后一道防线。

事务处理方法

直接写入SQL

通过ADO.NET实现

COM+事务(分布式事务)

2.1 直接写入SQL

在存储过程中使用BEGIN TRAN,COMMIT TRAN,ROLLABACK TRAN 实现

优点:

    所有事务逻辑包含在一个单独的调用中

    拥有运行一个事物的最佳性能

    独立于应用程序

限制:

    事务上下文仅存在于数据库调用中

    数据库代码与数据库系统有关

DEMO1 直接写入SQL

--SqlAction--

CREATE PROCEDURE [SqlAction] AS

begin TRAN

declare @UserInfoError int

delete from [tbUserInfo] where username='邵志东'

select @UserInfoError =@@error

if(@UserInfoError =0)

COMMIT TRAN

else

ROLLBACK TRAN

GO

private void btnOK_Click(object sender, System.EventArgs e)

         {

              SqlConnection myConnection = new SqlConnection("Server=.;database=myDataBase;UID=sa;pwd=sa;");

              myConnection.Open();

              SqlCommand myCommand = new SqlCommand();

              myCommand.Connection=myConnection;

              myCommand.CommandType = CommandType.StoredProcedure;

              myCommand.CommandText = "SqlAction";

              myCommand.ExecuteNonQuery();

              myConnection.Close();

         }

2.2 ADO.NET 事务处理

在ADO.NET中,可以使用Connection和Transaction对象来控制事务。若要执行事务,请执行下列操作。

调用Connection对象的BeginTwansaction方法来标记事务的开始

将Transaction对象分配给要执行的Command的Transaction属性。

执行所需的命令

调用Transaction对象的Commit方法来完成事务,或调用Rpllback方法来取消事务。

DEMO 2 ADO.NET 事务处理

private void btnOK_Click(object sender, System.EventArgs e)

         {

              SqlConnection myConnection = new SqlConnection("Server=(local);Initial Catalog=Northwind;uid=sa;pwd=sa;");

              myConnection.Open();

              // 启动一个事务

              SqlTransaction myTrans = myConnection.BeginTransaction();

              // 为事务创建一个命令

              SqlCommand myCommand = new SqlCommand();

              myCommand.Connection=myConnection;

              myCommand.Transaction = myTrans;

              try

              {

                  myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (110, 'Description')";

                   myCommand.ExecuteNonQuery();

                   //myTrans.Commit();

myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (111, 'Description')";

                   myCommand.ExecuteNonQuery();

                   myTrans.Commit();

                   Response.Write("成功写入记录!");

              }

              catch(Exception Ex)

              {

                   myTrans.Rollback();

                   Response.Write(Ex.ToString());

                   Response.Write("写入数据库失败!");

              }

              finally

              {

                   myConnection.Close();

              }

 

         }

ADO.NET事务处理

优点:

     简单性

     和数据库事务差不多快

     独立于数据库,不同数据库的专有代码被隐藏了

缺点:

     事务不能跨越多个数据库连接

     事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。

2.3 COM+ 事务

一般的数据库事务控制要求事务里所有的操作必须在同一个数据库内,这样在出现错误的时候才能回滚(RllBack)到初始状态。这就存在一个问题,在分布式应用程序中,我们往往需要同时操作多个数据库,使用数据库本身的事务处理,很难满足程序对事务控制的要求。在COM+中,提供了完整的事务服务,我们可以利用它来完成在分布式应用程序中的事务控制。

创建参与自动事务的类

1.                将TransactionAttribute类应用于您的类,指定组件请求的自动事务类型。事务类型必须是TransactionOption枚举的成员。

2.                从ServicedComponent类派生您的类。SercivedComponent是所有使用COM+服务的类的基类。

3.                用强名称(stiong name)标记(sign)程序集(阿瑟sembly),确保程序集包含唯一的密钥对。

4.                在COM+catalog中注册包含您的类的程序集。

定义一个COM+事务处理的类

[Transaction(TransactionOption.Required)]

Public class

DataAccess:System。EnterpriseServices。ServicedComponent

{

}

TransactionOption枚举类型支持5个COM+值

Disabled 忽略当前上下文中的任何事务。

NotSupported 使用非受控事务在上下文中创建组件。

Required 如果事务存在则共享事务,并且如有必要则创建新事务。

RequiredNew使用新事务创建组建,而与当前上下文的状态无关。

Supported 如果事务存在,则共享该事务。

强名称

为使该组件正确运行,该组件必须有一个强名称。生成一个强名称,然后使用该强名称对程序集进行签名。为此,请按照下列步骤操作:

在命令提示符下,键入sn.exe-k  snEnterprose.snk复制到您的项目文件中。

在Assemblyinfo.vc中,将以下代码添加到其它程序集属性语句之前后之后:[assembly:AssemblyKeyFileAttribute(”..//..//snEnterprise.snk”)]

进行保存,然后生成您的项目

使用regsvcs.exe将Dll注册到COM+Services里面。

DEMO 3 使用COM+事务处理

注意事项

确保使用COM+服务的所有项目都是一个强名称。

使用COM+服务的所有类都是必须继承服务组件。服务组件位于System.EnterpriseServices 命名空间中。

进行调试时,事务在提交或终止前可能会超时。要避免出现超时,请在事务属性中使用一个超时属性。在下面的示例中,在完成任何事务时,关联的方法在超时前都有1,200秒的执行时间。[Transaction(TransactionOption.Requried,timeout:=1022)]

异常处理

什么是异常处理

异常是正在执行的程序遇到的任何错误情形或者以外行为。

很多原因都是可以引起异常,例如,代码中错误、操作系统资源不可用、公共语言运行时(conmmon language runtime)中的以外情况等等

然而应用程序能够从上述的一些情况中恢复执行,但是大多数运行时异常不可恢复的。在这种情况下,需要一种有效的方法来处理这些异常并给调用者提供相同的异常。

用结构化的异常处理方法来处理异常

在.net web 服务中,对异常处理支持的关键点是由 try……catch……finally语句提供的。

关键字try放在可能抛出异常的普通处理代码块之前。

关键字catch放在异常处理代码块之前。

关键字finally放在那些经常在异常处理后还需要执行的代码块之前。

一旦异常从try代码块中抛出,程序流切换到后面的第一个catch代码块。

 

异常类

Exception 所有异常对象的基类

SystemException 运行时产生的所有错误的基类

IndexOutOfRangeException 当一个数组的下标超出范围是运行时引发

NullRefetenceException 当一个空对象被引用是运行时引发

InvaliOperationException当对方法的调用对对象的当前状态无效时,由某些方法引用。

ArgumentException所有参数异常的基类

ArgumentNullException 在参数为空(不允许)的情况下,由方法引用。

ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发。

IneropException目标在或发生在CLR外面环境中的异常的基类

ComException 包含COM类的HRESULT信息的异常

SEHException 封装win32结构异常处理信息的异常

DEMO4 结构化异常处理

优化异常

理解异常是一定会发生的

    大多数的软件系统都不是百分之百可靠的

    要站在异常一定可能会发生的角度来编写异常处理程序,应对程序有可能发生的错误。

    建立一个良好的异常处理策略。

处理未预料的异常

    确保所有程序的入口都使用了try-catch

    在catch中截获所有的异常。

异常处理注意事项

当引发异常时,要提供有意义的文本

要引发异常仅当条件是真正异常;也就是当一个正常的返回值不满足时。

如果你的方法或属性被传递一个坏参数,要引发一个ArgumentException异常

当调用操作不适合对象的当前状态时,要引发一个InvalidOoerationException异常。

要引发最合适的异常

要是链接异常,他们允许你跟踪异常树。

不要为正常或预期的错误使用异常

不要为流程的正常控制使用异常

不要在方法中引发NullReferenceException或IndexOutOfRangeException异常

异常处理技术

记录异常

    在文件中记录异常

    在数据库中记录异常

    在eventlog中记录异常

发送email通知异常

异常产生时,用友好(user-发riendly) 的方式通知用户

处理错误

Page_Error事件

Application_Error事件

利用配置文件,自定义错误页面

<customErrors defaultRedirect=”url” mode”RemoteOnly”>

<error statusCode=”code” redirect=”url”></errpr>

</customErrors>

DEMO5 编写到windows错误日志把错误发送邮件到管理员自定义错误页面

protected void Application_Error(Object sender, EventArgs e)

         {

              //把错误信息发送到作者

              string strPageUrl = Request.Path;

              Exception ErrorInfo =Server.GetLastError();

              //Server.ClearError();

              string strMessage = "Url:" + strPageUrl + "</br>";

              strMessage = strMessage + " Error: ";

              strMessage = strMessage + ErrorInfo.ToString() + "</br>";

 

              MailMessage Mymessage = new MailMessage();

              Mymessage.To = "wkjs@163.com";

              Mymessage.From = "wkjs@163.com";

              Mymessage.Subject = "ASP.NET Error";

              Mymessage.BodyFormat = MailFormat.Text;

              Mymessage.Body = strMessage;

              SmtpMail.Send(Mymessage);

 

         }

private void btnCal_Click(object sender, System.EventArgs e)

         {

              try

              {

                   int nInput = int.Parse(tbInput.Text);

                   long nResult=1;

                   for(int i=1;i<=nInput;i++)

                       checked{nResult *= i;}

                   lbResult.Text = nResult.ToString();

              }

              catch(OverflowException)//溢出错误异常处理

              {

                   throw new Exception("输入的数字太大,我受不了了!");

              }

              catch(FormatException)//输入字符格式错误异常处理

              {

                   Response.Write("嘿!要输入整数!");

              }

              catch(Exception ee)

              {

                   Response.Write("发生错误,信息为:"+ee.Message);

              }

        

         }

 

         private void WebForm1_Error(object sender, System.EventArgs e)

         {

              string strMessage = Server.GetLastError().Message;

              //Response.Write(strMessage);

              Server.ClearError();

              //以下把信息写入windows日志

              //要把aspnet用户添加到管理员组中,以便有写注册表权限

              if(!EventLog.SourceExists("mySource"))

                   EventLog.CreateEventSource("mySource","myLog");

              EventLog Event = new EventLog();

              Event.Source = "mySource";

              Event.WriteEntry(strMessage,EventLogEntryType.Warning);

              //EventLog.Delete("myLog");

              throw new Exception("我处理不了,请最高人民法院处理!");

 

 

         }

 

OTN设备核心知识速记 本文章为工作笔记,若有错误,还需大家指正。不定期更新。 阅读详情

相关推荐

Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台

本文以诺依项目为例详细记录了Kubernetes集群的部署过程以及配套DevOps环境的搭建。主要内容包括:1) 配置8个节点的软硬件环境;2) 基础环境准备(网络、防火墙、Docker等);3) 三节点Kubernetes集群部署;4) GitLab代码仓库安装;5) Harbor私有镜像仓库搭建;6) Jenkins持续集成工具配置;7) 基于若依项目的CI/CD实践;8) Rancher集群管理工具部署。

hickman2023的博客 1202

数据库的事务处理

事务的概念、事务的特性

二哈喇子! 4106

地图可视化类型大全

地图可视化类型大全: 散点地图 网格地图 聚合地图 气泡地图 热力图 Choropleth地图/分级设色地图/分级区域地图/着色地图/分级统计地图(百度百科这样翻译)/等值域地图/分段设色地图 Cartogram地图/变形地图/示意地图 规则形状地图 /RecMap/Demers Cartogram/瓷砖网格地图/DorlingMap 流型图(Flow Map)\流线图\流向图\轨迹地图 复合地图

codeuniverse的博客 3533

事务处理(结合分布式事务)

一般的事务处理,分为一下几种: 本地事务 共享事务 全局事务 分布式事务 本地事务 常见的本地事务,有数据库的事务, redis事务。即是一种单服务,单数据源的提交形式 共享事务 这是一个伪需求,实际上多服务,单数据源的场景很少见 全局事务 这是单服务, 多数据源的场景,一种强一致性的事务解决方案 有以下实现: 2PC: 两阶段提交 提交过程: 准备、提交 缺点:单点问题, 性能问题(同步阻塞), 一致性风险 3PC: 三阶段提交 提交过程: CanCommit, PreCom

NiDeHaoPengYou的博客 996

Landsat9 地表温度反演方法

landsat9地表温度反演及缺失值处理方法

xiangliu12345的博客 3919

PCB之AD层次化原理图设计

PCB之AD层次化(模块化)原理图设计 软件版本:AD17.1.9(bBuild 592) 先上效果图: 可以看到,图中有RS485和W5500这两个部分是复用了原理图,当项目中需要多个功能相同的电路时,这种设计就可以大大节约PCB布局布线的时间,方法后面介绍; 1.首先确定好项目中个部分电路的功能模块 不同功能的电路分开不同原理图画,然后给出输入输出端口,这样方便复用,下面是实例项目的功能划分 2.单个模块电路的接口设计 这里以W5500以太网接口电路为例说明: 主要就分为通讯接口和电源接口:

洋洋洋的博客 3万+

事务处理

1.事务处理基本原理 事务是一组作为一个单元成功或失败的相关任务。在事务处理术语中,事务要么提交,要么中止。若要提交事务,所有参与者都必须保证对数据的任何更改是永久的。不论系统崩溃或是发生其他无法预料的事件,更改都必须是持久的。 只要有一个参与者无法做出此保证,整个事务就会失败。事务范围内的所有数据更改将回滚到特定设置点。 事 务将多个任务绑定在一起。例如,假设某个 ASP.NET 页执...

weixin_30757793的博客 281

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

takedachia的博客 8698

spring当中的事务处理教程

事务是指一组数据库操作,要么全部执行,要么全部不执行。在事务的控制下,一组操作要么全部成功,要么全部失败,不会出现部分成功、部分失败的情况。Java Spring框架中的事务是指对数据库操作的一组操作,通过对这组操作的控制,保证操作的一致性和完整性。事务管理是Java Spring框架的核心功能之一,它可以帮助开发人员实现对数据库的事务控制,确保数据的一致性和完整性。在Java Spring框架中,可以通过基于XML的配置方式或基于注解的方式来实现事务管理。

weixin_44251099的博客 1065

VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping

文章目录写在前面摘要1.引言2.相关工作3.系统概述4.视觉前端5.双目视觉惯性里程计A. IMU预积分因子B. 非结构化视觉因子C. 优化和边缘化6. 激光建图A. LiDAR扫描去畸变B. 帧到地图配准7. LiDAR增强的闭环A. 回环检测B. 回环约束C. 全局位姿图优化D. 重定位8. 实验结果A.平台和软件B.测试和结果C. EuRoCMAV数据集测试9.结论 写在前面 写作参考: robot L 开源代码: 开源代码链接 论文原文: 原文链接 摘要 SLAM是移动和空中机器人的一项基本任务

JaydenQ的博客 2321

开源Harness项目DeerFlow 2.0,让智能体几乎能完成任何复杂任务

从提示工程到上下文工程,再到如今的 Harness,这条演进路径的本质是从“教模型如何理解人类”迈向“为模型构建一个可执行、可信赖、可长期运转的数字世界”。 当越来越多像 DeerFlow 2.0 这样的 Super Agent Harness 走向普及,AI 将真正进化为能理解、会规划、可执行、敢交付、长期负责的成熟生产力形态。

技术引领业务创新 520

Asp.net三种事务处理

Asp.net三种事务处理 事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下三种总结整理如下: 方法1:直接写入到sql 中 在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现 begin trans declare @orderDetailsError int,@procuntError int delete from

鲁班学艺 911

华为OD机试真题 新系统【查找温度记录统计信息】

华为OD机试 新系统真题【查找温度记录统计信息】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找温度记录统计信息】多语言题解。

qq_45776114的博客 487

asp.net三种事务处理

asp.net三种事务处理 2007-04-01 19:24

networdboy的天空 570

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

asp.net 事务处理小结

asp.net 事务处理小结 方法1:直接写入到sql 中 在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现 begin trans declare @orderDetailsError int,@procuntError int delete from [order details] where productid...

weixin_30639719的博客 74

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

不同环境下的事务处理(asp.net)

ASP.NET中的事务处理和异常处理 使用SQL-Transaction类和.NET提供的异常处理机制,我们就能够以一种可靠的方式处理数据库运行中的问题和发现系统异常。这篇小文章将解释事务处理和异常处理的概念和用法。  什么是事务?  事务处理是由以一个单一的逻辑单位完成的一系列操作,它可以由一系列的SQL语句、SELECT、INSERT、UPDATE、DELETE...

weixin_30770495的博客 115

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ASP.NET中的事务处理和异常处理

ASP.NET中的事务处理和异常处理使用SQL-Transaction类和.NET提供的异常处理机制,我们就能够以一种可靠的方式处理数据库运行中的问题和发现系统异常。这篇小文章将解释事务处理和异常处理的概念和用法。  什么是事务?  事务处理是由以一个单一的逻辑单位完成的一系列操作,它可以由一系列的SQL语句、SELECT、INSERT、UPDATE、DELETE组成,如果在该单位包含的操

Steven.Leong的专栏 865

asp.net事务处理

asp.net事务处理function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyit=window.open(http://www.36

Quick start 999

ASP.NET里的事务处理

ASP.NET里的事务处理 事务是一组组合成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。如果在事务过程中没有遇到错误,事务中的所有修改都将永久成为数据库的一部分。如果遇到错误,则不会对数据库作出任何修改。   例如,在一个银行应用程序中,如果资金从一个帐户转到另一个帐户,则会将一定的金额记入一个帐户的贷方,同时将相同的金额记入另一个帐户的借方。

2B酱的编程Tips的专栏 302

asp.net mysql 事务_asp.net 数据库连接 使用事务处理(一)

在.net中,事务处理机制共有四种:数据库事务;ADO.NET事务;ASP.NET事务;企业服务及事务。ASP.NET事务是在Web应用程序的页面层工作,只需简单的在页面属性中加一个"Transaction="Required"",这样页面中的时间处理都作为页面整个事务的 一部分,该页面的任何处理出现问题,所以的处理都会回滚。为了执行一个ADO.NET事务,首先需要创建一个SqlTransacti...

weixin_39647180的博客 247

数据库事务处理(asp.net)

在对两个表进行操作时,比如一个主表,一个从表,这两个表在数据库中指定了有外键约束,而这时在对这两个表进行一些操作时,最好是用事务处理,比如插入,更新或删除操作.下面做一个往主从表插入的操作......我建立了一个事务测试数据库,有省和市两个表.SQL代码如下:create database TransactionTestuse TransactionTestcreate table tbProvi

任游.Abraham.Wei.rEny0u.pRince 1048
上一篇: C#中DLL的调用---隐式调用
下一篇: 调试和跟踪ASP.NET应用程序
wkjs
博客等级 码龄22年 43粉丝 123原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值