数据库事务及实现方案小议

时间:2022-09-26 07:49:38

数据库事务及实现方案小议

摘要:事务是数据库相关课程的一个重要知识点。针对目前教学中普遍存在的问题,结合案例详细介绍几种数据库事务的常见实现方案,给出不同方案的综合评价和应用建议。实际教学效果证明了教学方法的有效性。

关键词:数据库;事务;实践

数据库原理及应用是计算机专业的核心专业课程,该类课程系统、完整地讲述了当前数据库技术的基本原理,并结合具体的数据库管理系统(DBMS)和应用程序集成开发环境(IDE)介绍原理的应用过程。课程的教学目的是让学生对数据库系统的基本概念和原理有较全面的了解,同时具备使用数据库管理系统软件和开发数据库应用系统的能力。

事务处理是在数据处理时经常遇到的。通常情况下,对于一个数据库驱动的应用系统,其数据库部分通常包含多个数据表,表之间的关系支撑着整个系统的数据逻辑结构,在系统设计时必须考虑数据库完整性问题,一般采用事务实现。根据实际情况选择合适的事务实现方案是在实际应用开发中的一项重要工作,要求开发者既要具有广泛而深入的数据库原理和系统实现知识,又要有扎实的应用设计能力,熟悉操作系统和有关软硬件环境。目前,虽然有一些数据库教材[1-2]及相关研究文献[3-4]涉及到事务处理,但是,存在的普遍问题是没有明确地从实际应用中讨论事务及其实现方案,缺乏综合分析和应用指导,不利于学生实践能力的提高。

笔者结合多年数据库相关课程教学实践和项目开发经验,以SQL Server和.NET平台为例说明事务实现的教学方法。首先给出基本概念和案例,然后介绍不同的事务实现方案,并进行综合分析,最后给出实践中事务实现的方案选择建议。

1概念及案例

1.1基本概念

所谓事务[1]是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID特性。

根据提交方式的不同,事务分为隐式事务和显示事务。其中隐式事务由系统提交,又称自动提交事务;显示事务由用户编程提交。

1.2案例说明

为方便起见,本文使用经典的银行转账案例来介绍,即在A账户向B账户转账(金额为m)时,首先在事务开始时判断A账户余额是否满足要求,如果满足要求,则从A账户余额中扣除m,同时给B账户余额增加m;否则,回滚事务。同时假定A账户与B账户属于同一银行。相关表结构如表1和表2所示。

2数据库事务常见实现方案

根据创建和管理事务的不同方式,数据库事务分为SQL事务和.NET事务两种[5]。

2.1SQL事务

SQL事务是指使用SQL代码创建和管理的事务,运行在存储过程和触发器等数据库对象中,该方案将事务处理的任务交给SQL Server服务器完成。

1) 存储过程方式。

由于具有效率高、减少网络流量等多方面优点,存储过程在工程项目中被广泛使用。在存储过程中实现事务时,必须以begin transaction命令开始,并以commit或rollback命令结束。例如,转账存储过程设计如下:

create procedure sp_TransAcnt

@FromAID char(20),

@ToAID char(20),

@TAmt money

As

declare @FromBal money

set xact_abort on

begin transaction

select @FromBal=Bal from Accounts

whereAID = @FromAID

if @FromBal < @TAmt

rollback

else

begin

//修改转出账户余额

update Accounts

set Bal=Bal- @TAmt

where AID = @FromAID

//修改转入账户余额

update Accounts

set Bal = Bal + @TAmt

where AID = @ToAID

//添加转账日志记录

insert TransferLogs

values(@FromAID,@ToAID, @TAmt)

end

commit

2) 触发器方式。

触发器是一种特殊的存储过程,在特定条件下触发执行,其执行体本身是一个隐式事务,会自动提交,只需要添加执行回滚操作的逻辑。比如,在TransferLogs表中创建触发器如下:

create trigger tr_TransAcnt on TransferLogs

instead of insert

As

//声明局部变量,然后从inserted表中提

//取信息,并存放在相应变量中。

//声明局部变量,并提取相应账户余额。

if 账户余额小于转账金额

rollback

else

begin

//修改转出账户余额、转入账户余

//额、添加转账日志记录。

End

其中,局部变量和转账处理命令与存储过程方式类似。

2.2NET事务

.NET事务是指在C# 等.NET语言代码中创建和管理的事务,需要借助.NET对象在应用程序中实现。

2.2.1使用相关对象实现

是微软.NET Framework中的数据访问组件,提供了平台互用性和可伸缩的数据访问。它由一组用于和数据源进行交互的对象,其中可用于事务操作的对象包括Connection对象和SqlTransaction对象。

1) Connection对象。

Connection对象代表与数据源的连接。在打开状态下,调用Connection对象的BeginTransaction()方法,返回一个DbTransaction对象[6]。由于该类是抽象类,在实际应用中必须使用它的某个子类表示,在中的不同数据访问提供程序命名空间里,DbTransaction类都有相应的不同子类。比如,OracleTransaction 和SqlTran- saction分别表示对Oracle数据库和SQL Server数据库执行的T-SQL事务处理。下面主要讨论SqlTransaction对象。

2) SqlTransaction对象的运用。

SqlTransaction对象中用于事务处理的方法包括:Save()用来在事务中建立保存点,并指定保存点名称;Commit()用来提交数据库事务,Rollback()是从挂起状态回滚事务。处理转账的代码如下所示:

private static void TransAcnt(string conString)

{

using (SqlConnection con = new SqlConnection(conString))

{

con.Open();

SqlTransaction trans = con.BeginTransac

tion(); // 开始事务

try

{

SqlCommand cmd = con. CreateCommand();

cmd.Connection = con;

cmd.Transaction = trans;

//执行“修改转出账户余额命令”

//执行“修改转入账户余额命令”

//执行“添加转账日志记录命令”

mit();//提交事务

}

catch (Exception ex)

{

trans.Rollback();//回滚事务

}}}

其中,conString表示数据库连接字符串,转账相关信息可以通过传递参数或对象属性获得,修改转出和转入账户余额、添加转账日志记录的命令可以是T-SQL脚本或存储过程。在工程项目中,通常把基本的数据处理代码封装成存储过程,以提高模块间独立性、代码可维护性和可复用性。

2.2.2使用System.Transactions相关对象

1) 使用TransactionScope对象。

使用TransactionScope对象实现事务处理的方式称为隐式事务编程模型,事务的ACID属性实现、事务的提交和回滚都在其基础结构中完成,事务以调用Complete()方法作为结束。

转账示例代码如下:

private static void TransAcnt()

{

using (TransactionScope ts = new TransactionScope())

{

try

{ /*修改转出账户余额、转入账户余额、添加转账日志记录。*/

plete();//完成事务

}

catch (SqlException ex)

{

//异常处理代码

}}}

其中,3个转账处理操作可以直接使用相关对象实现(见2.2.1节)。在工程项目中,通常把相关命令实现为独立的方法,封装在相应的用户自定义数据访问类中。

2) 使用CommittableTransaction对象。

CommittableTransaction 对象为应用程序使用事务提供了一种显式方法,对于要跨多个函数调用或多个线程调用使用同一事务的应用程序来说十分有用。与TransactionScope 类不同,需要在应用程序明确调用Commit和Rollback方法以提交或中止事务。示例代码如下:

private static void TransAcnt(string conString)

{

using (SqlConnection con = new SqlConnection(conString))

{

using (CommittableTransaction ct = new CommittableTransaction())

{

con.Open();

con.EnlistTransaction(ct);

try

{/*修改转出账户余额、转入账户余额、添加转账日志记录。*/

mit();//提交事务

}

catch (SqlException ex)

{

ct.Rollback();

}}}}

其中,conString表示数据库连接字符串,3个转账处理操作的实现方式与2.2.1节类似。

3方案分析与选择

在应用系统设计实践中,“合适的才是最好的”的准则仍然适用。其实,所谓“最好”是在受限条件下在各种需求之间找到最佳平衡点,让学生理解这一点是非常有必要的。在选择事务实现方案时,需要考虑的因素包括服务器性能、网络传输能力、事务执行效率、代码可复用性、业务逻辑封装性、系统可维护性、异构数据源支持程度等。不同事务实现方案的综合分析如表3所示。

4结语

通过对以上五种方案的分析和示例的演示,大部分学生对事务的不同处理方案有了较为清晰的认识。然后要求学生在实验课上分组编程实现给定的任务,以增强学生的合作意识和实践能力,并进一步发现其不足。实际教学效果表明,该教学方法帮助学生加深了解事务基本原理,使他们学会分析问题、解决问题的方法,培养系统思维,提高实践能力。

参考文献:

[1] 王珊,萨师煊. 数据库系统概论[M]. 4版. 北京:高等教育出版社,2007:278-279.

[2] 范明,叶阳东,邱保志,等. 数据库原理教程[M]. 北京:科学出版社,2008:264-268.

[3] 王艳红,章晓莉,姜湘岗. 在数据库课程设计中培养学生项目开发能力[J]. 计算机教育,2009(13):91-94.

[4] 薛云.“数据库原理与应用”课程实践教学的改革与探索[J]. 计算机教育,2009(22):129-131.

[5] Karli Watson. C# 2005数据库编程经典教程[M]. 4版. 陈秋萍,译. 北京:人民邮电出版社,2007:333-346.

[6]Microsoft Cooperation. DbTransaction类[EB/OL]. [2011-01-04]. /zh-cn/library/ system.

mon.dbtransaction.aspx.

Research on the Teaching Method of Database Transaction and its Realization Solutions

SUN Yigui, XU Su, XU Zhenqiang

(School of Information Science and Engineering, Henan University of Technology, Zhengzhou 450001, China)

Abstract: Transaction is on of the important knowledge points. According to the common problems existing in the teaching, some kinds of realization solutions to Database transaction are detailed discussed combined with cases. In addition, we proposed the comprehensive evaluation of such solutions and application advice. The good effect of the presented method has been summarized through practical teaching.

Key words: Database; transaction; practice

上一篇:智能游戏开发与设计课程建设探讨 下一篇:我国计算机普及的历程及其启示