<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
数据库事务
数据库事务是其他事务模型的基础,本文讨论的事务都是基于数据库事务实现的,他们仅是隐藏了处理事务的复杂的或者容器专有的代码。当一个事务创建时不同数据库系统都有自己的规则。缺省地,SQL Server工作在自动提交的模式下,每个语句执行完后会立即提交,与此对照的是Oracle需要你包含一个提交语句。但是当一个语句通过OLEDB执行时,它执行完后一个提交动作会被附加上去。为了使下面的例子适用于Oracle,你需要去掉begin transation和commit 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.Data和System.Data.SqlClient类库,为了执行一个事务,你需要创建一个SqlTransation对象,可以调用你的SqlConnection对象BeginTransation()方法来创建它,一旦你把SqlTransation对象存为本地变量,你就可以把它赋给你的SqlCommand对象的事务属性,或者把它作为构造器的一个参数来创建SqlCommand。在执行SqlCommand动作之前,你必须调用BeginTransaction()方法,然后赋给SqlCommand事务属性。
一单事务开始了,你就可以执行任何次数的SqlCommand动作,只要它是属于同一个事务和连接。最后你可以调用SqlTransation的Commit()方法来提交事务。
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>
图7:ASP.Net事务的统计
分享到:
相关推荐
读者将学习如何使用DataSet、DataTable、DataAdapter等组件来处理数据库数据,以及如何实现数据绑定,使Web页面动态显示数据库内容。此外,Entity Framework也会被提及,它是微软提供的一个ORM(对象关系映射)工具...
在ASP.NET中,与数据库交互通常通过ADO.NET(ActiveX Data Objects .NET)来实现,这是.NET Framework的一部分,提供了对各种数据库系统的访问能力。ADO.NET模型由几个主要组件组成:DataSets、DataTables、Data...
6. 事务处理:支持数据库事务,确保数据的一致性和完整性。 7. 错误处理和异常捕获:提供统一的错误处理机制,方便调试和记录日志。 "External"可能是一个包含外部依赖项或其他辅助工具的文件夹,这些工具可能用于...
4. **Entity Framework**:虽然ASP.NET 2.0本身不包含Entity Framework,但书中可能提到了这个后来出现的对象关系映射(ORM)工具,它是微软推荐的数据访问框架,简化了数据库操作。 5. **数据绑定和控件**:书中...
【标题】"基于VB.NET的数据库应用程序设计"深入探讨了如何使用Microsoft的VB.NET编程语言来构建与数据库交互的应用程序。在VB.NET中,数据库应用是通过ADO.NET框架实现的,这是一个强大的工具集,用于访问各种关系型...
10. **ODBC连接**: 对于非Microsoft数据库,可以使用`OdbcConnection`类。连接字符串格式会根据所使用的ODBC驱动程序有所不同。 11. **LINQ to SQL** 和 **Entity Framework**: 这是两种高级的数据访问技术,提供更...
这个压缩包文件很可能是对ADO.NET数据库访问技术的详细讲解,涵盖数据库设计规范和三层架构下的数据访问层实现。通过学习,开发者可以深入理解如何使用ADO.NET与数据库进行高效交互,并掌握数据库设计的最佳实践,...
在IT行业中,数据库开发是至关重要的领域,而Visual Basic.NET(简称VB.NET)作为微软.NET框架的一部分,提供了强大的工具和库来实现这一目标。本文将深入探讨VB.NET与数据库开发的相关知识点,帮助开发者掌握如何...
在VB.NET编程环境中,操作Access数据库是一项常见的任务,这主要涉及到ADO.NET库的使用,它提供了与各种数据库交互的能力。本篇文章将详细讲解如何利用VB.NET进行Access数据库的增删改查操作。 首先,我们需要引入...
本教程将详细介绍如何使用C#和ASP.NET来实现SQL Server数据库的备份。 首先,我们需要理解SQL Server的备份机制。SQL Server提供了多种备份类型,包括完整备份、差异备份、日志备份等。完整备份会保存整个数据库,...
综上所述,【asp.net 全能数据库】是一个全面的数据库解决方案,它结合了数据库连接、SQL执行、ORM、事务管理等多种功能,旨在为ASP.NET开发者提供强大且易用的数据库操作工具。开源的性质使得开发者可以根据需要...
你可以使用Transaction对象来管理数据库事务,确保一组操作要么全部成功,要么全部回滚。例如: ```vb.net Using transaction As SqlTransaction = connection.BeginTransaction() Try ' 执行一系列数据库操作 ...
VB.NET结合了微软的ADO.NET(ActiveX Data Objects .NET)库,使得数据库操作变得简单且高效。下面我们将深入探讨VB.NET与数据库开发的相关知识点。 1. ADO.NET概述:ADO.NET是.NET Framework的核心组件,用于处理...
综上所述,"基于ASP.NET和数据库的网页设计"项目涵盖了从后端到前端的完整Web开发流程,适合初学者学习和实践,通过这个项目,不仅可以掌握ASP.NET和SQL Server的基本使用,还能深入了解HTML、CSS和JavaScript在网页...
ASP.NET 是微软公司开发的一种用于构建动态网站、Web 应用和Web 服务的技术框架,它基于.NET Framework,提供了一套高效、安全且易于维护的Web 开发平台。本教程将深入探讨如何在ASP.NET环境下进行数据库程序设计,...
综上所述,ASP.NET连接数据库Microsoft .dll文件涉及到的关键知识点包括ADO.NET架构、Oracle数据提供者、数据库连接字符串配置、数据库操作类的使用以及最佳实践。在实际开发中,正确理解和运用这些知识点将有助于...
VB.NET是微软.NET框架下的一个面向对象的编程语言,它提供了丰富的功能和易用性,使得开发者能够轻松创建桌面、Web和移动应用。而数据库则是存储和管理数据的核心工具,对于任何应用程序来说,理解和掌握如何使用...
5. **异步操作**:利用.NET框架提供的异步编程模型,如async/await关键字,可以实现数据库访问的非阻塞,提高应用程序的响应速度。 6. **错误处理和事务管理**:有效的错误处理和事务管理能确保数据的一致性和完整...
通过这个案例导航,开发者可以深入理解ASP.NET 2.0与数据库的结合使用,学习如何设计和实现高效的Web应用程序。每个章节可能都包含了详细的步骤、代码示例以及解释,帮助开发者逐步掌握数据库项目的开发技能。在实践...