数据库事务处理的分析与探讨

2017-10-21 20:15李焕玲
电脑知识与技术 2017年18期
关键词:数据库

李焕玲

摘要:该文介绍了SQL Server数据库中事务的概念及分类,以及事务处理的必要性。并举例探讨了在SQL Server数据库中如何使用事务,介绍了在Java中利用JDBC进行事务处理的方法。

关键词:数据库;事务处理;数据一致性

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)18-0023-02

随着计算机技术的飞速发展,数据库技术在实际生活中得到了广泛的应用,在使用过程中也从单个用户向网络用户发展,这也使得数据库在安全性管理上显得更为迫切。在数据库操作过程中,有时要执行的一个SQL语句块中,可能为会出现一条或几条语句因意外故障而被中断执行,这样就有要能产生数据库中的数据不一致,解决这个问题的方法就是数据库的事务。

1事务概述

数据库中的事务是一组T-SQL语句组成的集合,这组语句必须作为一个整体来执行,要么成功执行每一条语句,要么一条语句发生意外未被执行,则所有操作复原,数据库恢复到语句执行之前的状态。例如,银行的转账业务,将A账户向B账户转入1000元钱,要完成转账业务,首先将A账户中的余额减少1000元,再将B账户余额增加1000元,这两个操作均成功后才能完成转账业务,否则,数据恢复,取消转账,这就是一个事务。

1.1事务特性

事务作为单个逻辑工作单元,它具有4个特性:

原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行;

一致性(Consistency):当事务完成或失败时,数据必须处于一致状态;

隔离性(Isolation):对数据进行的事务操作是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务;

永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。

1.2事务类型

sql server数据库中的事务分为三类:显式事务、隐式事务和自动提交事务。

显示事務:用begin tran指定事务的开始,以committran或rollback tran语句结束。这是最常用的事务类型。

隐性事务:通过设置set implicit transactions on语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个T-SQL语句又将启动一个新事务。

自动提交事务:这是SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务,如果成功执行,则自动提交,如果错误,则自动回滚。

2 sql server中的事务处理

sql server中的事务以BEGIN TRANSACTION指定事务的开始,以commit tran或rollback tran语句结束。假如,A账户中有100元,B账户中有100元,现在将A账户的1000元转入B账户,代码如下:

begin tran

update account set rmb=rmb-1000 where username=′A′

update account set rmb=rmb+1000 where username=′B′

commit tran

因为A账户的余额不足,执行时会出现一个违反check约束的错误信息,但随后又提示“1行受影响”。我们执行select*from account后发现A账户中的余额不足,所以第一行update语句没有执行,但B账户中却增加了1000元钱。这是什么原因呢?原来SQL Server在发生runtime错误时,默认会rollback引起错误的语句,而继续执行后续语句。这显示是不合理的,我们应避免这种情况发生。

2.1利用set xactabort on

在事务处理的最前面加上set xact_abort on语句,当xact_abort选项为on时,SQL Server在遇到错误时会终止执行并rollback整个事务。代码如下:

set xact_abort on

begin tran

update account set rmb=rmb-1000 where username=′A′

update account set rmb=rmb+1000 where username=′B′

commit tran

此时,会发现当A中余额不足时,转账失败,B账户中的余额也没有增加。

2.2判断每条SQL语句

在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。利用@@ERROR的值进行判断SQL语句是否成功执行,若@@ERROR的值大于0,SQL语句失败,则回滚事务并恢复数据库。代码如下:

begin tran

update account set rmb=rmb-1000 where username=′A′

if@@error>0

rollback tran

update account set rmb=rmb+1000 where username=′B′

if@@error>0

rollback tran

commit tran

2.3利用try…catch异常处理机制

在SQL Server中,可利用try…catch异常处理机制来处理事务,代码如下:endprint

begin tran

begintry

update account set rmb=rmb-1000 where username=′A′

update account set rmb=rmb+1000 where username=′B′

endtry

begin catch

if@@error>0

rollback tran

end catch

if@@trancount>0

commit tran

3 java中的事務

在Java中使用JDBC建立与数据库的连接,执行SQL语句并处理执行结果。那么,在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,建立一个数据库连接对象Connec-tion时,事务处理默认是auto-commit模式,这时每个SQL语句都被当做一个事务,即每次执行一个语句,都会自动的提交该事务。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽。在auto-commit模式屏蔽之后,只有调用commit()方法,SQL语句才会提交事务,若要撤销事务,则利用rollback()方法。例如,将A账户转入B账户1000元,其中COBB为Connection对象,以下代码来实现该事务处理:

public void editBank0{

conn.setAutoCommit(false);∥关闭自动提交

String sqll="update account set rmb=rmb-1000 where user-name=′A′":

String sql2="update account set rmb=rmb+1000 where user-name=′B′";

tty{

Stement st=conn.createStatement();∥创建stmemem对象

conn.setAutoCommit(false);∥关闭自动提交模式

st.executeUpdate(sql1);

st.executeUpdate(sql2);

conn.commit();∥提交事务

System.out.println("转账成功");

}catch(Exception e){

try{

conn.rollback();∥回滚事务

System.out.println("转账失败");

}catch(SQLException e1){

eL.printStackTrace();}

∥e.printStackTrace();}}

当两条SQL语句执行成功时,调用commit()方法提交事务,转账成功,否则调用rollback()方法回滚事务,转账失败,数据库恢复到未转账之前的状态,从而保证数据的一致性。

4总结

综上所述,事务是数据库中的核心概念,只有科学合理地使用事务处理,才能提高信息系统的运行效率,保证数据一致性和完整性问题,从而确保数据的安全性。endprint

猜你喜欢
数据库
超星数据库录入证
本刊加入数据库的声明
两种新的非确定数据库上的Top-K查询
国外数据库高被引论文排行TOP10
国内主要期刊数据库