分享
 
 
 

在.NET中处理事务(2)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

自动事务和 XML Web services [C#]

ASP.NET 使用与 Web 窗体一致且相似的编程抽象模型为创建和公开 XML Web services 提供内置支持。结果模型是可伸缩和可扩展的,并接受 HTTP、XML、SOAP、WSDL 开放式 Internet 以及其他标准。XML Web services 支持开放式标准,因此任何客户端或支持 Internet 的设备都可访问和使用 XML Web services。

XML Web services 提供了在自动事务范围内运行代码的选项。事务确保与资源管理器(如 SQL Server、MSMQ 服务器、Oracle 服务器和 SNA 服务器)的所有交互维护运行可靠的分布式应用程序所需的 ACID 属性。

使用 WebMethod 特性的 TransactionOption 属性声明一个自动事务。如果将 TransactionOption 属性设置为 TransactionOption.RequiresNew,则每次 XML Web services 客户端调用 XML Web services 方法时,都会开始一个新事务。

下列代码片断显示公开一个 XML Web services 方法(名为 DeleteAuthor)的服务。此 XML Web services 方法执行一个自动事务范围内的数据库操作。

[Visual Basic]

<%@ WebService Language="VB" Class="Orders" %>

<%@ assembly name="System.EnterpriseServices" %>

Imports System

Imports System.Data

Imports System.Data.SqlClient

Imports System.Web.Services

Imports System.Web.Util

Imports System.EnterpriseServices

Public Class Orders

Inherits WebService

<WebMethod(TransactionOption := TransactionOption.RequiresNew)> _

Public Function DeleteAuthor(lastName As String) As Integer

Dim deleteCmd As [String] = "DELETE FROM authors2 where au_lname='"

& lastName & "'"

Dim sqlConn As New SqlConnection("user

id=sa;database=pubs;server=myserver")

Dim myCommand As New SqlCommand(deleteCmd, sqlConn)

' If a XML Web service method is participating in a transaction and

' an exception occurs, ASP.NET automatically aborts the transaction.

' Likewise, if no exception occurs, then the transaction is

' automatically committed.

myCommand.Connection.Open()

Return myCommand.ExecuteNonQuery()

End Function

End Class

[C#]

<%@ WebService Language="C#" Class="Orders" %>

<%@ assembly name="System.EnterpriseServices" %>

using System;

using System.Data;

using System.Data.SqlClient;

using System.Web.Services;

using System.Web.Util;

using System.EnterpriseServices;

public class Orders : WebService

{

[ WebMethod(TransactionOption=TransactionOption.RequiresNew)]

public int DeleteAuthor(string lastName)

{

String deleteCmd = "DELETE FROM authors2

where au_lname='" + lastName + "'" ;

SqlConnection sqlConn = new SqlConnection("user

id=sa;database=pubs;server=myserver");

SqlCommand myCommand = new SqlCommand(deleteCmd,sqlConn);

// If a XML Web service method is participating in a transaction and an

// exception occurs, ASP.NET automatically aborts the transaction.

// Likewise, if no exception occurs, then the transaction is

// automatically committed.

myCommand.Connection.Open();

return myCommand.ExecuteNonQuery();

}

}

注意 仅当激活的 XML Web services 方法(从客户端调用的方法)有事务元数据时,事务才会开始。如果激活的 XML Web services 方法未携带合适的事务元数据,则后继的 XML Web services 方法可能既不参与现有事务也不开始新事务。

自动事务和 .NET 框架类 [C#]

只要准备了 .NET 框架类参与自动事务,此类的实例就可以参与自动事务。类实例或对象访问的每个资源都在事务中登记。例如,如果一个对象使用 ADO.NET 发送数据库中某帐户上的钱,此数据库的资源管理器将确定该对象是否在事务中执行。如果对象是在事务中执行,则资源管理器自动在事务中登记此数据库。

使用下列过程准备参与自动事务的类:

将 TransactionAttribute 应用于此类。

从 ServicedComponent 类派生此类。

用强名称为程序集签名。

若要使用特性为程序集签名,请使用 Sn.exe 实用工具创建一个密钥对。

sn -k TestApp.snk

添加 AssemblyKeyFileAttribute 或 AssemblyKeyNameAttribute 程序集特性(它们指定包含密钥对的文件的名称),以使用强名称为程序集签名。

[Visual Basic]

<assembly: AssemblyKeyFileAttribute("TestApp.snk")>

[C#]

[assembly: AssemblyKeyFileAttribute("TestApp.snk")]

向 COM+ 目录注册包含此类的程序集。

如果类的客户端调用实例是由公共语言运行库管理的,则注册将自动执行。但是,如果预期非托管调用方可能创建和调用类的实例,请使用 .NET 服务安装工具 (Regsvcs.exe) 手动执行注册。

下列示例显示如何将 TransactionAttribute 应用到从 ServicedComponent 类派生的类。

[Visual Basic]

<Transaction(TransactionOption.Required)> Public Class Bar

Inherits ServicedComponent

'. . .

End Class

[C#]

[Transaction(TransactionOption.Required)]

public class Bar(): ServicedComponent

{

//. . .

}

应用事务特性时,可以交替使用 Transaction、transaction、TransactionAttribute 和 transactionattribute。例如,可以使用 Transaction 或 transactionattribute 产生相同的结果。

下表列出并描述每个构造函数变体。

特性值

说明

Disabled

消除自动事务对对象的控制。应用此特性值的对象可以直接将分布式事务处理协调器 (DTC) 用于事务性支持。

[Transaction(TransactionOption.Disabled)]

NotSupported

指示对象不在事务范围内运行。处理请求后,不管是否有活动事务,均在没有事务的情况下创建其对象上下文。

[Transaction(TransactionOption.NotSupported)]

Supported

指示如果有事务,则对象在现有事务的上下文中运行。如果没有事务,则对象在没有事务的情况下运行。

[Transaction(TransactionOption.Supported)]

Required

(默认值)

指示对象需要事务。如果有事务,则对象在现有事务范围中运行。如果没有事务,则对象启动一个事务。

[Transaction(TransactionOption.Required)]

RequiresNew

指示对象需要事务且为每个请求启动新事务。

[Transaction(TransactionOption.RequiresNew)]

示例类

下列代码示例说明自动事务的若干元素。此例中,事务性类和调用此类的客户端都由运行库管理。

[Visual Basic]

' -----------------------------------------------------------------

' TestApp.vb

' Generate a Strong name:

' sn -k TestApp.snk

' Compile the code:

' vbc /target:exe /r:System.EnterpriseServices.dll TestApp.vb

' Run TestApp:

' start TestApp.exe

' -----------------------------------------------------------------

Option Explicit

Option Strict

Imports System

Imports System.Runtime.CompilerServices

Imports System.EnterpriseServices

Imports System.Reflection

'Registration details.

'COM+ application name as it appears in the COM+ catalog.

<assembly: ApplicationName("TestApp")>

'Strong name for assembly.

<assembly: AssemblyKeyFileAttribute("TestApp.snk")>

<Transaction(TransactionOption.Required)> Public Class Account

Inherits ServicedComponent

'Provides SetComplete behavior in the absence of exceptions.

<AutoComplete()> Public Sub Debit(amount As Integer)

' Do some database work. Any exception thrown here aborts the

' transaction; otherwise, transaction commits.

End Sub

End Class

Public Class client

Public Shared Sub Main()

Dim accountX As New Account()

accountX.Debit(100)

Environment.Exit(0)

End Sub

End Class

[C#]

// -----------------------------------------------------------------

// TestApp.cs

// Generate a Strong name:

// sn -k TestApp.snk

// Compile the code:

// csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs

// Run TestApp:

// start TestApp.exe

// -----------------------------------------------------------------

using System;

using System.Runtime.CompilerServices;

using System.EnterpriseServices;

using System.Reflection;

//Registration details.

//COM+ application name as it appears in the COM+ catalog.

[assembly: ApplicationName("TestApp")]

//Strong name for assembly.

[assembly: AssemblyKeyFileAttribute("TestApp.snk")]

[Transaction(TransactionOption.Required)]

public class Account : ServicedComponent

{

//Provides SetComplete behavior in the absence of exceptions.

[AutoComplete]

public void Debit(int amount)

{

// Do some database work. Any exception thrown here aborts the

// transaction; otherwise, transaction commits.

}

}

public class client

{

public static int Main()

{

Account accountX = new Account();

accountX.Debit(100);

return 0;

}

}

自动事务中的投票 [C#]

.NET 框架类和 ASP.NET 页可以通过投票来提交或中止它们的当前事务。默认情况下,如果代码中没有显式投票,则默认为赞成提交。但默认提交可能会延长为每个事务释放昂贵资源所用的时间,从而可能降低应用程序的性能。

显式投票还允许类或页在遇到严重错误时中止事务。此外,可以通过在事务处理的早期捕获致命错误、结束事务、释放资源等手段来提高应用程序的性能。

使用自动完成

System.EnterpriseServices.AutoCompleteAttribute 使参与事务的对象投票赞成在方法正常返回时完成事务。如果方法调用引发异常,则中止事务。只能将此特性应用于从 ServicedComponent 类派生的类。

若要使用此功能,请在类方法前插入此特性。如果将此特性添加到接口方法,则公共语言运行库将忽略它。下列代码片断显示此特性在事务识别类上的位置。

[Visual Basic]

<Transaction(TransactionOption.Supported)> Public Class Account

Inherits ServicedComponent

<AutoComplete()> Public Sub Debit(amount As Integer)

' Do some database work. Any exception thrown here aborts the

' transaction; otherwise, transaction commits.

End Sub

End Class

[C#]

[Transaction(TransactionOption.Supported)]

public class Account : ServicedComponent {

[AutoComplete]

public void Debit(int amount) {

// Do some database work. Any exception thrown here aborts the transaction;

// otherwise, transaction commits.

}

}

使用 SetAbort 和 SetComplete

可以使用公开 SetComplete 或 SetAbort 方法的 System.EnterpriseServices.ContextUtil 类来显式提交或中止事务。SetComplete 指示对象投票赞成提交其工作;SetAbort 指示对象遇到了问题且投票赞成中止正在进行的事务。直到事务的根对象停用,才提交或中止事务。此外,任何参与事务的对象中有一个中止投票,都将导致整个事务失败。

下列代码片断显示正在使用的 SetAbort 和 SetComplete 方法。

[Visual Basic]

'Try to do something crucial to the transaction in progress.

If Not DoSomeWork() Then

'Something goes wrong.

ContextUtil.SetAbort()

Else

'All goes well.

ContextUtil.SetComplete()

End If

[C#]

//Try to do something crucial to the transaction in progress.

if( !DoSomeWork() )

{

//Something goes wrong.

ContextUtil.SetAbort();

}

else

{

//All goes well.

ContextUtil.SetComplete();

}

总结

上面是VS.NET中处理事务方面的一些概念和少许示例,给大家参考一下。有任何建议请MAIL我 paulni@citiz.net

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有