软件开发中的事务处理

原创 2007年09月20日 11:53:00
最近在CSDN里面看到了几个关于软件开发过程中的如何处理事务的帖子,而自己在前一个工程中也遇到了类似问题,以为事务处理部分设计的不当,造成了以后软件的维护和升级的很多麻烦。

事务简单的理解,就是一系列相关操作,而工程中希望这一系列操作,可以一起被执行,或者一起被回滚,而不希望出现前几步成功,后面失败的情况。做典型的例子就是银行转账,从一个户头减去一定数额,在另外一个加上相应数额,两个步骤需要同是成功或者失败。

在前面的blog( 一个简单用户系统的设计)中我提高过,一个工程基本上分为三个部分,UI,service和DAO。而我前面提到的我的上一个项目,也正是这样划分层次的。但是由于数据量比较大,更新比较频繁,公司决定,将数据库同时布置在两台服务器上面,一台专门负责写操作(W_S),在固定时间将写的服务器上的数据传送给专门负责读操作的服务器 (R_S),从而减轻数据库的压力。

而工程刚刚开始时,我们将事务处理部分放在DAO层,连接的打开、提交、回滚、关闭都放在DAO层处理。但是在测试中逐渐发现以下问题,有的时候我们需要使用W_S中的数据,进行读操作,比如说,一个刚刚注册的用户要进行一些读操作,但是这个时候在 R_S还没有这个用户的信息,在这种情况下,我们不得不将涉及到这种行为的读操作使用W_S的连接,这样一来,对系统的效率,以及整个工程的编码完整性都带来了破坏。

因此,在新的工程中我提出,将对数据库的连接、提交、回滚和关闭操作放在service层,并将DAO中各个方法更加独立化,微粒化,在解决上面遇到问题的同时,也提高了代码的重用性。当然也带来了一些设计上的其他问题:

1、如何回滚,当DAO方法跑出异常时,如果要进行的是写操作,我们需要回滚,这样一来我们需要在Service层抓住DAO抛出的所有异常,并回滚,然后再抛出该异常。这样就形成了
catch(***Exception e){
    ConnectionPool.rollback(Connection);
    throw e;
}

这样的代码,好像catch块的作用仅仅是为了回滚事务,代码的可读性减少了很多。而且由于DAO层抛出的异常为Runtime异常,使得编写代码要格外小心。

2、Service层涉及到数据库连接建立,从结构上说破坏了层间的独立性。其实这个问题可以得到很好地解决,只是需要在Service层和DAO层类的设计上作更详细地说明。

其实这种在service层进行事务处理的方法在Spring这个框架中体现得非常充分,而且Spring使用AOP和Ioc非常巧妙地解决了上面的两个问题。有兴趣的读者可以看一看Spring的文档,必定受益匪浅。

软件开发中的事务处理(二)

版权所有: idilent 网站转载请注明作者并链接到http://blog.csdn.net/idilent,
其他转载方式请与作者联系(idilent@yahoo.com.cn)。

spring事务处理详解

1:Java包含两种异常:checked异常和unchecked异常。checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获try-catch-finally,而u...
  • u013628152
  • u013628152
  • 2015年08月25日 18:02
  • 4109

JDBC中的事务处理

 在JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。我们通过提交commit()或是回退rollback()来结束事务的操作。关于事务操作的方法都位于接口java...
  • csc0211
  • csc0211
  • 2011年03月08日 16:45
  • 6746

软件开发过程中的事务处理(三)

在使用Hibernate时,我们会发现Hibernate在装载一个对象的时候有两个方法可以使用:load和get,而这两个方法的调用方法基本上是一致的,而唯一的区别就是,当Hibernate没有找到对...
  • idilent
  • idilent
  • 2007年10月11日 10:20
  • 792

软件开发过程中的事务处理(二)

在上一篇软件开发中的事务处理 中我们已经比较了将connection的打开、关闭以及提交和回滚放在service层和DAO层,而笔者认为,放在service层更为合理,这样可以更有效的控制事务,但是这...
  • idilent
  • idilent
  • 2007年10月10日 13:48
  • 906

数据库事务处理机制

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTrans...
  • u013588712
  • u013588712
  • 2016年06月08日 16:24
  • 1902

MySQL事务处理实现方法步骤

需求说明:  案例背景:银行的转账过程中,发生意外是在所难免。为了避免意外而造成不必要的损失,使用事务处理的方式进行处理: A账户现有余额1000元,向余额为200的B账户进行转账500元。可能由于某...
  • hello_zhou
  • hello_zhou
  • 2016年07月09日 12:39
  • 7705

Spring事务处理-编程式事务和声明式事务

Spring框架提供编程式事务处理和声明式事务处理。 编程式事务处理就是指在业务代码中利用Spring框架提供的一些类进行事务处理。 声明式事务处理就是指在xml配置文件或注解的方式声明对某个类方法进...
  • yizhenn
  • yizhenn
  • 2016年08月11日 14:11
  • 1555

Hibernate 事务处理

事务是指由一个或者多个SQL语句组成的工作单元,这个单元中SQL语句只要有一个SQL语句执行失败,就会撤销整个工作单元。  事务的成功取决于工作单元的所有SQL语句都执行成功,它必须具备ACID...
  • jazywoo123
  • jazywoo123
  • 2012年08月08日 14:21
  • 841

myBatis事务处理

1. myBatis单独使用时,使用SqlSession来处理事务:  Java代码   public class MyBatisTxTest {          p...
  • qqlrq
  • qqlrq
  • 2015年05月18日 17:52
  • 2970

分布式系统常见的事务处理机制

为保障系统的可用性、可靠性以及性能,在分布式系统中,往往会设置数据冗余,即对数据进行复制。举例来说,当一个数据库的副本被破环以后,那么系统只需要转换到其他数据副本就能继续运行下去。另外一个例子,当访问...
  • kkkloveyou
  • kkkloveyou
  • 2017年04月14日 00:11
  • 3603
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:软件开发中的事务处理
举报原因:
原因补充:

(最多只允许输入30个字)