数据库事务处理的分析与探讨
2017-10-21李焕玲
李焕玲
摘要:该文介绍了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