网站首页  词典首页

请输入您要查询的论文:

 

标题 数据库事务处理的分析与探讨
范文

    李焕玲

    摘要:该文介绍了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′

    [email protected]@error>0

    rollback tran

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

    [email protected]@error>0

    rollback tran

    commit tran

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

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

    begin tran

    begintry

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

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

    endtry

    begin catch

    [email protected]@error>0

    rollback tran

    end catch

    [email protected]@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总结

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

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/2/6 5:54:17