Asp.Net事务和异常处理:
2008-06-06 14:07
295 查看
Asp.Net事务和异常处理:
一。什么是事务处理?
事务处理是一组组和成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。
如果在事务过程中没有遇到错误,事务中的所有修改都将永久成为数据库中的一部分,如果遇到错误,则不会对数据库进行任何修改。
二。事务处理过程。
1. 开始一个事务。进入“事务待命”状态。
2. 在“事务待命”状态,记录事务中改变的数据库记录。此改变不能直接改变数据库中的值,必须先用一个顺序的“事务日志”记录在一边。同时,对于要改变的原始记录加锁,让其它用户无法读和写。如果记录已经被其它事务加锁,则报错。
3. 在“事务待命”,如果用户给出commit transaction命令,则进入“事务拷贝”状态,拷贝所有加锁的记录成备份。
4. 上面3执行完,则进入“事务更新”状态,用“事务日志”中记录一一更新实际的数据库记录。
5. 上面4执行完,则进入“事务结束”状态,释放所有的记录锁,然后抛弃“事务日志”和备份的原数据库记录。
6. 上面5做完后,事务被删除。但是,最为关键的是,事务系统必须执行以下过程:一但数据库由于软件、硬件问题发生故障,重启动后,一旦有事务没正常删除,则:
7. 如果在“事务待命”、“事务结束”状态,则重新从5中结束事务的动作开始执行。
8. 如果在“事务更新”状态,则重新从4开始更新记录,并继续想下执行。结果,虽然系统崩溃过,但事务仍然能正常提交。
三。事务处理的有关事项
•事务处理的关键是在提交事务或者取消事务时,万一系统崩溃了,数据库在再次启动时,仍然需要保持数据可逻辑一致性。
• 应用中包含的事务应当尽量让它“瞬间”完成,避免在比较忙时造成用户进程的互锁。
• Informix、Oracle、DB2等数据库的实际事务处理流程更复杂,目的是具有更好的抵抗系统错误性质,因为事务保护是业务系统安全稳定的最后一道防线。
四。事务处理的方法
1,直接写入SQL。我们来看一个例子。新建一个表,具体过程我就不给出了,大家自己建,也就是达到测试地目的,有个用户名就可以。然后写存储过程:
create procedure [SqlAcTran] As
begin tran
declare @UserInfoError int
delete from [SqlAction] where username='测试'
select @UserInfoError =@@error
if(@UserInfoError =0)
commit tran
else
rollback tran
go
然后建立一个页面,页面简单之极,只用一个BUTTON来执行命令,然后对BUTTON编程,这里如果对连接语句不明白的话参加我的
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
namespace WebApplication1
2,Ado.Net事务处理。
在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
• 调用Connection 对象的BeginTransaction 方法来标记事务的开始。
• 将Transaction 对象分配给要执行的Command的Transaction 属性。
• 执行所需的命令。
• 调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。
当然ADO.NET事务处理有优点和缺点,运用起来看具体情况了。
• 优点:
– 简单性
– 和数据据事务差不多的快
– 独立于数据库,不同数据库的专有代码被隐藏了
• 缺点:
– 事务不能跨越多个数据库连接
– 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。
下边我们看一个例子,建立一个页面,同样简单,只需要一个按钮,然后编程:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
namespace WebApplication1
use myDatabase
go
create table ComAction
(
userID int identity,
userName varchar(30) not null,
userScore int not null
)
insert into ComAction values('张三',100)
首先我们建立一个类库prjEnterprise 添加引用System.EnterpriseService。 然后添加一个类clsEs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.EnterpriseServices;
namespace prjEnterprise
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace WebApplication1
{
{
{
{
{
{
{
{
{
Response.Write("事务失败!");
}
}
}
}
什么是异常处理
• 异常是正在执行的程序所遇到的任何错误情形或者意外行为。
• 很多原因都可以引起异常,例如,代码中错误、操作系统资源不可用、公共语言运行时(common language runtime)中的意外情况等等。
• 然而应用程序能够从上述的一些情况中恢复执行,但是大多数运行时异常是不可恢复的。在这种情况下,需要一种有效的方法来处理这些异常并给调用者提供相同的异常。
用结构化的异常处理方法来处理异常
• 在.NET Web服务中,对异常处理支持的关键点是由try...catch..finally语句提供的。
• 关键字try放在可能抛出异常的普通处理代码块之前。
• 关键字catch放在异常处理代码块之前。
• 关键字finally放在那些经常在异常处理后还需要执行的代码块之前。
• 一旦异常从try代码块中抛出,程序流切换到后面的第一个catch代码块
异常类
• Exception 所有异常对象的基类
• SystemException 运行时产生的所有错误的基类
• IndexOutOfRangeException 当一个数组的下标超出范围时运行时引发
• NullReferenceException 当一个空对象被引用时运行时引发
• InvalidOperationException 当对方法的调用对对象的当前状态无效时,由某些方法引发
• ArgumentException 所有参数异常的基类
• ArgumentNullException 在参数为空(不允许)的情况下,由方法引发
• ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发
• InteropException 目标在或发生在CLR外面环境中的异常的基类
• ComException 包含COM 类的HRESULT信息的异常
• SEHException 封装win32 结构异常处理信息的异常
优化异常
• 理解异常是一定会发生的
– 大多数的软件系统都不是百分之百可靠的!
– 要站在异常一定可能会发生的角度来编写异常
处理程序,应对程序有可能发生的错误。
– 建立一个良好的异常处理策略
• 处理未预料的异常
– 确保所有程序的入口都使用了try-catch
– 在catch中截获所有的异常
异常处理注意事项
• 当引发异常时,要提供有意义的文本。
• 要引发异常仅当条件是真正异常;也就是当一个正常的返回值不满足时。
• 如果你的方法或属性被传递一个坏参数,要引发一个ArgumentException异常。
• 当调用操作不适合对象的当前状态时,要引发一个InvalidOperationException异常。
• 要引发最适合的异常。
• 要使用链接异常,它们允许你跟踪异常树。
• 不要为正常或预期的错误使用异常。
• 不要为流程的正常控制使用异常。
• 不要在方法中引发NullReferenceException或IndexOutOfRangeException异常。
异常处理技术
• 记录异常
– 在文件中记录异常
– 在数据库中记录异常
– 在eventlog中记录异常
• 发送email通知异常
• 异常产生时,用友好(user-friendly)的方式通知用户
处理错误
• Page_Error事件
• Application_Error事件
• 利用配置文件,自定义错误页面
– <customErrors defaultRedirect="url" mo
de="RemoteOnly">
<error statusCode="code" redirect="url
"></error>
</customErrors>
异常的例子我就不说了,大家知道的一定比我多,网上也可以搜到很多相关的例子来。
一。什么是事务处理?
事务处理是一组组和成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。
如果在事务过程中没有遇到错误,事务中的所有修改都将永久成为数据库中的一部分,如果遇到错误,则不会对数据库进行任何修改。
二。事务处理过程。
1. 开始一个事务。进入“事务待命”状态。
2. 在“事务待命”状态,记录事务中改变的数据库记录。此改变不能直接改变数据库中的值,必须先用一个顺序的“事务日志”记录在一边。同时,对于要改变的原始记录加锁,让其它用户无法读和写。如果记录已经被其它事务加锁,则报错。
3. 在“事务待命”,如果用户给出commit transaction命令,则进入“事务拷贝”状态,拷贝所有加锁的记录成备份。
4. 上面3执行完,则进入“事务更新”状态,用“事务日志”中记录一一更新实际的数据库记录。
5. 上面4执行完,则进入“事务结束”状态,释放所有的记录锁,然后抛弃“事务日志”和备份的原数据库记录。
6. 上面5做完后,事务被删除。但是,最为关键的是,事务系统必须执行以下过程:一但数据库由于软件、硬件问题发生故障,重启动后,一旦有事务没正常删除,则:
7. 如果在“事务待命”、“事务结束”状态,则重新从5中结束事务的动作开始执行。
8. 如果在“事务更新”状态,则重新从4开始更新记录,并继续想下执行。结果,虽然系统崩溃过,但事务仍然能正常提交。
三。事务处理的有关事项
•事务处理的关键是在提交事务或者取消事务时,万一系统崩溃了,数据库在再次启动时,仍然需要保持数据可逻辑一致性。
• 应用中包含的事务应当尽量让它“瞬间”完成,避免在比较忙时造成用户进程的互锁。
• Informix、Oracle、DB2等数据库的实际事务处理流程更复杂,目的是具有更好的抵抗系统错误性质,因为事务保护是业务系统安全稳定的最后一道防线。
四。事务处理的方法
1,直接写入SQL。我们来看一个例子。新建一个表,具体过程我就不给出了,大家自己建,也就是达到测试地目的,有个用户名就可以。然后写存储过程:
create procedure [SqlAcTran] As
begin tran
declare @UserInfoError int
delete from [SqlAction] where username='测试'
select @UserInfoError =@@error
if(@UserInfoError =0)
commit tran
else
rollback tran
go
然后建立一个页面,页面简单之极,只用一个BUTTON来执行命令,然后对BUTTON编程,这里如果对连接语句不明白的话参加我的
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
namespace WebApplication1
2,Ado.Net事务处理。
在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
• 调用Connection 对象的BeginTransaction 方法来标记事务的开始。
• 将Transaction 对象分配给要执行的Command的Transaction 属性。
• 执行所需的命令。
• 调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。
当然ADO.NET事务处理有优点和缺点,运用起来看具体情况了。
• 优点:
– 简单性
– 和数据据事务差不多的快
– 独立于数据库,不同数据库的专有代码被隐藏了
• 缺点:
– 事务不能跨越多个数据库连接
– 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。
下边我们看一个例子,建立一个页面,同样简单,只需要一个按钮,然后编程:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
namespace WebApplication1
use myDatabase
go
create table ComAction
(
userID int identity,
userName varchar(30) not null,
userScore int not null
)
insert into ComAction values('张三',100)
首先我们建立一个类库prjEnterprise 添加引用System.EnterpriseService。 然后添加一个类clsEs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.EnterpriseServices;
namespace prjEnterprise
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace WebApplication1
{
{
{
{
{
{
{
{
{
Response.Write("事务失败!");
}
}
}
}
什么是异常处理
• 异常是正在执行的程序所遇到的任何错误情形或者意外行为。
• 很多原因都可以引起异常,例如,代码中错误、操作系统资源不可用、公共语言运行时(common language runtime)中的意外情况等等。
• 然而应用程序能够从上述的一些情况中恢复执行,但是大多数运行时异常是不可恢复的。在这种情况下,需要一种有效的方法来处理这些异常并给调用者提供相同的异常。
用结构化的异常处理方法来处理异常
• 在.NET Web服务中,对异常处理支持的关键点是由try...catch..finally语句提供的。
• 关键字try放在可能抛出异常的普通处理代码块之前。
• 关键字catch放在异常处理代码块之前。
• 关键字finally放在那些经常在异常处理后还需要执行的代码块之前。
• 一旦异常从try代码块中抛出,程序流切换到后面的第一个catch代码块
异常类
• Exception 所有异常对象的基类
• SystemException 运行时产生的所有错误的基类
• IndexOutOfRangeException 当一个数组的下标超出范围时运行时引发
• NullReferenceException 当一个空对象被引用时运行时引发
• InvalidOperationException 当对方法的调用对对象的当前状态无效时,由某些方法引发
• ArgumentException 所有参数异常的基类
• ArgumentNullException 在参数为空(不允许)的情况下,由方法引发
• ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发
• InteropException 目标在或发生在CLR外面环境中的异常的基类
• ComException 包含COM 类的HRESULT信息的异常
• SEHException 封装win32 结构异常处理信息的异常
优化异常
• 理解异常是一定会发生的
– 大多数的软件系统都不是百分之百可靠的!
– 要站在异常一定可能会发生的角度来编写异常
处理程序,应对程序有可能发生的错误。
– 建立一个良好的异常处理策略
• 处理未预料的异常
– 确保所有程序的入口都使用了try-catch
– 在catch中截获所有的异常
异常处理注意事项
• 当引发异常时,要提供有意义的文本。
• 要引发异常仅当条件是真正异常;也就是当一个正常的返回值不满足时。
• 如果你的方法或属性被传递一个坏参数,要引发一个ArgumentException异常。
• 当调用操作不适合对象的当前状态时,要引发一个InvalidOperationException异常。
• 要引发最适合的异常。
• 要使用链接异常,它们允许你跟踪异常树。
• 不要为正常或预期的错误使用异常。
• 不要为流程的正常控制使用异常。
• 不要在方法中引发NullReferenceException或IndexOutOfRangeException异常。
异常处理技术
• 记录异常
– 在文件中记录异常
– 在数据库中记录异常
– 在eventlog中记录异常
• 发送email通知异常
• 异常产生时,用友好(user-friendly)的方式通知用户
处理错误
• Page_Error事件
• Application_Error事件
• 利用配置文件,自定义错误页面
– <customErrors defaultRedirect="url" mo
de="RemoteOnly">
<error statusCode="code" redirect="url
"></error>
</customErrors>
异常的例子我就不说了,大家知道的一定比我多,网上也可以搜到很多相关的例子来。
相关文章推荐
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- Asp.Net事务和异常处理:
- ASP.NET中的事务处理和异常处理
- Asp.Net事务和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET中的事务处理和异常处理
- ASP.NET事务处理和异常处理
- [导入]ASP.NET中的事务处理和异常处理
- [原]ASP.NET MVC异常处理方案
- asp.net事务处理
- ASP.NET中使用AJAX后,Session丢失异常的自定义处理。
- 在ASP.NET项目中建立统一的异常处理机制
- ASP.NET MVC异常处理方案