`
lovnet
  • 浏览: 6882561 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

用Microsoft.net实现数据库事务(二)

阅读更多

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

数据库事务

数据库事务是其他事务模型的基础,本文讨论的事务都是基于数据库事务实现的,他们仅是隐藏了处理事务的复杂的或者容器专有的代码。当一个事务创建时不同数据库系统都有自己的规则。缺省地,SQL Server工作在自动提交的模式下,每个语句执行完后会立即提交,与此对照的是Oracle需要你包含一个提交语句。但是当一个语句通过OLEDB执行时,它执行完后一个提交动作会被附加上去。为了使下面的例子适用于Oracle,你需要去掉begin transationcommit transation两个语句,因为这两个语句会当作一个单独的事务来运行。

优势

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

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

l 独立于应用程序

限制

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

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

例子:

CREATE PROCEDURE up_purchaseItem (

@customerId as int,

@itemId int,

@itemqty int)

AS

DECLARE @orderid int

BEGIN TRANSACTION

-- Update the inventory based on purchase

UPDATE inventory

SET qtyinstock = qtyinstock - @itemqty

WHERE inventory.productid = @itemid;

IF @@Error != 0 GOTO ERROR_HANDLER

-- Insert the order into the database

INSERT INTO orders

VALUES (@customerId, @itemId, @itemqty, getdate());

IF @@Error != 0 GOTO ERROR_HANDLER

SET @orderid = @@IDENTITY

COMMIT TRANSACTION

RETURN @orderid

ERROR_HANDLER:

ROLLBACK TRANSACTION

SET NOCOUNT OFF

RETURN 0

GO

ADO.NET事务

创建一个ADO.NET事务是很简单的,仅仅是标准代码的一个小的扩展。只要你知道如何使用ADO.NET来访问数据库,那就差不多知道了。区别仅仅是你需要把代码放到一个事务上下文中。

还是原来的ADO.NET类库引用,在实现事务的类里面引入System.DataSystem.Data.SqlClient类库,为了执行一个事务,你需要创建一个SqlTransation对象,可以调用你的SqlConnection对象BeginTransation()方法来创建它,一旦你把SqlTransation对象存为本地变量,你就可以把它赋给你的SqlCommand对象的事务属性,或者把它作为构造器的一个参数来创建SqlCommand。在执行SqlCommand动作之前,你必须调用BeginTransaction()方法,然后赋给SqlCommand事务属性。

一单事务开始了,你就可以执行任何次数的SqlCommand动作,只要它是属于同一个事务和连接。最后你可以调用SqlTransationCommit()方法来提交事务。

ADO.NET事务实际上是把事务上下文传递到数据库层,如果事务中发生一个错误,数据库会自动回滚。在你的错误处理代码中,每次调用Rollback()方法之前检查事务对象是否存在是一种良好的习惯。这样的一个例子是当一个死锁发生的同时,数据库正在执行自动回滚。

优势:

l 简单性

l 和数据库事务差不多的快

l 事务可以跨越多个数据库访问

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

限制:

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

例子:

public int purchaseitem(int customerId, int itemId, int itemQty)

{

SqlConnection con = null;

SqlTransaction tx = null;

int orderId = 0;

try

{

con = new SqlConnection("Data Source=localhost; user

Id=sa;password=;Initial Catalog=trans_db;");

con.Open();

tx = con.BeginTransaction(IsolationLevel.Serializable);

String updatesqltext = "UPDATE inventory SET qtyinstock

= qtyinstock - " + itemQty.ToString()

+ " WHERE inventory.productid = " + itemId.ToString();

SqlCommand cmd = new SqlCommand(updatesqltext, con, tx);

cmd.ExecuteNonQuery();

// String is 2 SQL statements: the first is the insert,

the second selects the identity column

String insertsqltext = "INSERT INTO orders VALUES

(" + customerId.ToString() + "," + itemId.ToString()

+ "," + itemQty.ToString() + " , getdate() ); SELECT @@IDENTITY";

cmd.CommandText = insertsqltext;

// Retrieve the order id from the identity column

orderId = Convert.ToInt32(cmd.ExecuteScalar());

cmd.Dispose();

tx.Commit();

}

catch (SqlException sqlex)

{

// Specific catch for deadlock

if (sqlex.Number != 1205)

{

tx.Rollback();

}

orderId = 0;

throw(sqlex);

}

catch (Exception ex)

{

tx.Rollback();

orderId = 0;

throw (ex);

}

finally

{

tx.Dispose();

con.Close();

}

}

ASP.NET事务

ASP.NET事务可以说是在.Net平台上事务实现方式中最简单的一种,你仅仅需要加一行代码。在ASPX的页面声明中加一个额外的属性,即是事务属性,它可以有 如下的值:Disabled (缺省), NotSupported, Supported, Required RequiresNew,这些设置和COM+以及企业级服务中的设置一样,典型地如果你想在页面上下文中运行事务,那么要设置为Required。如果页面中包含有用户控件,那么这些控件也会包含到事务中,事务会存在于页面的每个地方。

优势:

l 实现简单,不需要额外的编码

限制:

l 页面的所有代码都是同一个事务,这样的事务可能会很大,而也许我们需要的是分开的、小的事务

l 事务实在Web

例子:

ASPX page

<%@ Page Transaction="Required" language="c#" Codebehind="ASPNET_Transaction.aspx.cs"

Inherits="TransTest.ASPNET_Transaction" AutoEventWireup="false"%>

<html>

<head>

<title>ASP.NET Transaction</title>

</head>

<body MS_POSITIONING="GridLayout">

<form id="ASPNET_Transaction" method="post" runat="server">

</form>

</body>

</html>

ASPX Code behind page

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Data.SqlClient;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

namespace TransTest

{

/// Summary description for ASPNET_Transaction.

public class ASPNET_Transaction : System.Web.UI.Page

{

public int purchaseitem(int customerId, int itemId, int itemQty)

{

SqlConnection con = null;

int orderId = 0;

try

{

con = new SqlConnection("Data Source=localhost; user

Id=sa;password=;Initial Catalog=trans_db;");

con.Open();

String updatesqltext = "UPDATE inventory SET qtyinstock = qtyinstock

- " + itemQty.ToString() + " WHERE inventory.productid = " +

itemId.ToString();

SqlCommand cmd = new SqlCommand(updatesqltext, con);

cmd.ExecuteNonQuery();

String insertsqltext = "INSERT INTO orders VALUES

(" + customerId.ToString() + "," + itemId.ToString() + ","

+ itemQty.ToString() + " , getdate() ); SELECT @@IDENTITY";

cmd.CommandText = insertsqltext;

orderId = Convert.ToInt32(cmd.ExecuteScalar());

cmd.Dispose();

}

catch (Exception ex)

{

orderId = 0;

throw (ex);

}

finally

{

con.Close();

}

return orderId;

}

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

{

int orderid = purchaseitem(1, 1, 10);

Response.Write(orderid);

}

#region Web Form Designer generated code

}

}

注意到这些和ADO.NET事务的代码基本一样,我们只是移除了对SqlTransation对象的引用。这些事务被ASPX页面的声明Transaction="Required"所代替。在事务统计中,当页面执行后,事务数目会增加,一个语句失败后,所有的语句将会回滚,你会看到事务被取消了。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 356.25pt; HEIGHT: 264.75pt" type="#_x0000_t75"><img o:title="psent7" src="/Develop/ArticleImages/25/25154/CSDN_Dev_Image_2004-3-3956340.gif"><font size="3"></font></shape>

7ASP.Net事务的统计

分享到:
评论

相关推荐

    ASP.NET 4.5 数据库入门经典 第3版

    读者将学习如何使用DataSet、DataTable、DataAdapter等组件来处理数据库数据,以及如何实现数据绑定,使Web页面动态显示数据库内容。此外,Entity Framework也会被提及,它是微软提供的一个ORM(对象关系映射)工具...

    ASP.NET与数据库程序设计

    在ASP.NET中,与数据库交互通常通过ADO.NET(ActiveX Data Objects .NET)来实现,这是.NET Framework的一部分,提供了对各种数据库系统的访问能力。ADO.NET模型由几个主要组件组成:DataSets、DataTables、Data...

    ASP.NET通用数据库访问组件

    6. 事务处理:支持数据库事务,确保数据的一致性和完整性。 7. 错误处理和异常捕获:提供统一的错误处理机制,方便调试和记录日志。 "External"可能是一个包含外部依赖项或其他辅助工具的文件夹,这些工具可能用于...

    ASP.NET2.0数据库高级编程

    4. **Entity Framework**:虽然ASP.NET 2.0本身不包含Entity Framework,但书中可能提到了这个后来出现的对象关系映射(ORM)工具,它是微软推荐的数据访问框架,简化了数据库操作。 5. **数据绑定和控件**:书中...

    基于VB.NET的数据库应用程序设计

    【标题】"基于VB.NET的数据库应用程序设计"深入探讨了如何使用Microsoft的VB.NET编程语言来构建与数据库交互的应用程序。在VB.NET中,数据库应用是通过ADO.NET框架实现的,这是一个强大的工具集,用于访问各种关系型...

    vb.net连接数据库全集

    10. **ODBC连接**: 对于非Microsoft数据库,可以使用`OdbcConnection`类。连接字符串格式会根据所使用的ODBC驱动程序有所不同。 11. **LINQ to SQL** 和 **Entity Framework**: 这是两种高级的数据访问技术,提供更...

    ADO.NET访问数据库.rar_mysteriousi9b_基于ADO.net的数据库访问_数据库_访问数据库

    这个压缩包文件很可能是对ADO.NET数据库访问技术的详细讲解,涵盖数据库设计规范和三层架构下的数据访问层实现。通过学习,开发者可以深入理解如何使用ADO.NET与数据库进行高效交互,并掌握数据库设计的最佳实践,...

    Visual Basic.NET 与数据库开发

    在IT行业中,数据库开发是至关重要的领域,而Visual Basic.NET(简称VB.NET)作为微软.NET框架的一部分,提供了强大的工具和库来实现这一目标。本文将深入探讨VB.NET与数据库开发的相关知识点,帮助开发者掌握如何...

    vb.net 操作Access数据库

    在VB.NET编程环境中,操作Access数据库是一项常见的任务,这主要涉及到ADO.NET库的使用,它提供了与各种数据库交互的能力。本篇文章将详细讲解如何利用VB.NET进行Access数据库的增删改查操作。 首先,我们需要引入...

    c# asp.net实现sql server数据库备份

    本教程将详细介绍如何使用C#和ASP.NET来实现SQL Server数据库的备份。 首先,我们需要理解SQL Server的备份机制。SQL Server提供了多种备份类型,包括完整备份、差异备份、日志备份等。完整备份会保存整个数据库,...

    asp.net 全能数据库

    综上所述,【asp.net 全能数据库】是一个全面的数据库解决方案,它结合了数据库连接、SQL执行、ORM、事务管理等多种功能,旨在为ASP.NET开发者提供强大且易用的数据库操作工具。开源的性质使得开发者可以根据需要...

    VB.NET 针对数据库操作的程序

    你可以使用Transaction对象来管理数据库事务,确保一组操作要么全部成功,要么全部回滚。例如: ```vb.net Using transaction As SqlTransaction = connection.BeginTransaction() Try ' 执行一系列数据库操作 ...

    VB.NET与数据库开发

    VB.NET结合了微软的ADO.NET(ActiveX Data Objects .NET)库,使得数据库操作变得简单且高效。下面我们将深入探讨VB.NET与数据库开发的相关知识点。 1. ADO.NET概述:ADO.NET是.NET Framework的核心组件,用于处理...

    基于ASP.NET和数据库的网页设计

    综上所述,"基于ASP.NET和数据库的网页设计"项目涵盖了从后端到前端的完整Web开发流程,适合初学者学习和实践,通过这个项目,不仅可以掌握ASP.NET和SQL Server的基本使用,还能深入了解HTML、CSS和JavaScript在网页...

    ASP.NET与数据库程序设计教程

    ASP.NET 是微软公司开发的一种用于构建动态网站、Web 应用和Web 服务的技术框架,它基于.NET Framework,提供了一套高效、安全且易于维护的Web 开发平台。本教程将深入探讨如何在ASP.NET环境下进行数据库程序设计,...

    ASP.NET 连接数据库Microsoft .dll文件

    综上所述,ASP.NET连接数据库Microsoft .dll文件涉及到的关键知识点包括ADO.NET架构、Oracle数据提供者、数据库连接字符串配置、数据库操作类的使用以及最佳实践。在实际开发中,正确理解和运用这些知识点将有助于...

    《VB.NET+数据库入门经典(第2版)》.rar

    VB.NET是微软.NET框架下的一个面向对象的编程语言,它提供了丰富的功能和易用性,使得开发者能够轻松创建桌面、Web和移动应用。而数据库则是存储和管理数据的核心工具,对于任何应用程序来说,理解和掌握如何使用...

    基于.NET的数据库访问技术的优化研究

    5. **异步操作**:利用.NET框架提供的异步编程模型,如async/await关键字,可以实现数据库访问的非阻塞,提高应用程序的响应速度。 6. **错误处理和事务管理**:有效的错误处理和事务管理能确保数据的一致性和完整...

    ASP.NET 2.0 数据库项目案例导航

    通过这个案例导航,开发者可以深入理解ASP.NET 2.0与数据库的结合使用,学习如何设计和实现高效的Web应用程序。每个章节可能都包含了详细的步骤、代码示例以及解释,帮助开发者逐步掌握数据库项目的开发技能。在实践...

Global site tag (gtag.js) - Google Analytics