关于DB事务管理的两种解决方案

 

    我最近一直在思考一个问题,当自己不使用任何管理事务框架的时候,自己应该如何控制事务。

 

    如果我每次操作数据库,都是一个事务,每次都打开事务,关闭事务,那是一件很麻烦的事情,比如有以下方法

 

 

    如果我有很多很多的数据表,很多很多的DB操作,那我就需要写很多的打开事务,关闭事务的语句,这样很可能有所遗漏,而且以后很难找出因此发生错误的原因和地方,基于上面的原因,有了这篇文章。

 

    昨天晚上和朋友讨论了这个问题,他现在做的一个项目来说,是自己写代码自行控制事务,什么时候打开,什么时候关闭,都是自己决定,之所以采用这种方式,是因为他的项目是多数据源的,对于事务控制来说,是相当复杂的,人为的控制事务带来了一定的灵活性,当然其中也存在着一些风险,也会出现一些不可以预料的bug,因为你不得不对事务进行配对,有打开,就必须有关闭等等。

 

    目前,我只想到两种解决方案,我想这一定不是最好的,只是一种处理的方法,希望看到此博客的大侠们指点一二。

 

    事务管理方案一:

          此方案,也就是借鉴了spring中的AOP技术,使用代理模式,生成目标对象的代理对象,通过代理对象,对目标对象的方法执行进行控制。代码如下:

 

 

凡是获取Dao类,对DB进行CRUD操作,就是用DaoFactory.getBean("LoginDao");来获取,这个时候,就会给这个Dao创建一个代理类,在取得了Dao以后,调用Dao中的任何方法,都是通过Dao的代理类来执行的,也就是说,执行了AOPFactory 中public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;方法,比如,我需要调用更新方法

 

 

这个时候的执行结果就是:

 

     打开事务

     执行DB操作

     关闭事务

 

 

 

 

 事务管理方案二:

       使用注解的方式,具体实现方法是使用java的反射技术,生成一个统一对象方法调用接口,只要是调用一个对象中的方法,那么我们就用统一的模式。说起来比较绕口抽象,看如下代码:

//Excutor.java

 

 

// Transaction.java

 

 

//Register.java

 

 

这个时候我们需要调用Register中的方法,那么我们就是用上面的Excutor中的invoke方法

 

这样,我们就可以在需要事务的方法上面加上@Transaction注解,就可以实现事务的管理了,也就是说register方法中任何更删改查操作有一个失败,那就都失败,数据库回滚至调用register方法之前的状态。

 

其实还有一个很笨的方法,那就是在业务层,创建一个抽象类,其中有一个抽象方法,凡是实现业务层的类,都继承该抽象类,实现其中的抽象方法,这样,就可以做到在业务层对事务的统一管理了,不需要每次写一个更删改查都需要打开事务,关闭事务了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值