事务管理原理

wzs 2007-11-28 02:25:26
看了很一些网上的文章及spring事务源码但还不是很懂只知其一,下面代码是我疑惑的地方请高手指教:

spring事务基于Proxy代理机制实现的,Proxy代码

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class InterceptorProxy implements InvocationHandler
{
private Object proxyObject=null;
/**
*把obj实例与proxy绑定
*
/
public Object bind(Object obj)
{
this.proxyObject=obj;
Object proxyObj= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
return proxyObj;
}
/**
* 拦截obj实例调用某个方法
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object retu=null;
/**
* 事务开始
*/
retu=method.invoke(this.proxyObject, args);
/**
* 事务结束
*/
return retu;
}

}


// 从上面看代码是没有问题但在指行的时候就有问题如:
public static void main(String[] args)
{
Service service=InterceptorProxy.bind(serviceObject);//假设serviceObject是一个Service类实例
/*
当我调用method1()方法是会触发InterceptorProxy.invoke()方法,此时在invoke()中可以定义事务begin(),
但当method1()执行完后事务进行commit(),请问如何在method2()与method1()完成一起commit()?Spring能做到这一点,
说明这需要如何使用设计模式问题,大侠解一下困惑,相信很多人都想知道这个问题
*/

service.method1();
service.method2();
}
...全文
196 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyforlove 2007-12-05
  • 打赏
  • 举报
回复
补充:象在spring中直接调用如下这种方式spring在事务中也是很正确的处理,不知这是如何做到的?
public static void main(String[] args)
{
AbstractApplicationContext appContext=new ClassPathXmlApplicationContext(cfgs);
Services service=(Services)appContext.getBean(beanName);
service.method1();
service.method2();
}

-------------------------------

一般事务的控制就是service层,而且一次请求就只用一个service的方法,如果需要两个service方法的话(非常不推荐,但是也不是不能用)。
你可以在前一个方法中调用后一个方法,就像上面代码中在method1()中去调用method2(),注意两个方法的事务类型。
flyforlove 2007-12-05
  • 打赏
  • 举报
回复
那就是事务的声明在你的service层的上层,或者事务处理是在程序中进行的,而不是在配置文件里声明的。
wzs 2007-12-05
  • 打赏
  • 举报
回复
flyforlove:你说的这种方法确实会好很多,而且我也看过spring中有一部分代码实现是你说的这种方式,但事实我们在开发当中很多开发人员就会应用到我说的那种方式,我说的这种方式spring真的是完成好好的,这个一直搞不懂.
wzs 2007-12-04
  • 打赏
  • 举报
回复
spring事务再难也要啃一下,这对个人提升很有帮助,大伙帮忙顶一下吧,知道或知道一点的都抖出来别掖着嘛
cocosunshine 2007-11-30
  • 打赏
  • 举报
回复
spring事务处理非常复杂的。。
wzs 2007-11-30
  • 打赏
  • 举报
回复
补充:象在spring中直接调用如下这种方式spring在事务中也是很正确的处理,不知这是如何做到的?
public static void main(String[] args)
{
AbstractApplicationContext appContext=new ClassPathXmlApplicationContext(cfgs);
Services service=(Services)appContext.getBean(beanName);
service.method1();
service.method2();
}
wzs 2007-11-30
  • 打赏
  • 举报
回复
==>flyforlove听你一说确实给我一些灵感,你能不能对此再细的一些指导?万分感谢!也感谢其他朋友的回答,我说明一下我是想自己做一个事务管理的工具,而不是如何应用spring的
flyforlove 2007-11-29
  • 打赏
  • 举报
回复
你再仔细看看spring的代码不久完了,事务的开始提交回滚,需要比你的方法高一层,也就是在调用方法这层上,你却把它和方法放在同一层,自然无法控制多个方法了。
cocosunshine 2007-11-29
  • 打赏
  • 举报
回复
建议你使用spring的declarative transaction,直接在spring的applicationContext里面配置就好了。。这种侵入式的方式不好。
gougou8180 2007-11-29
  • 打赏
  • 举报
回复
就是一个面向切面编程 aop

用的是jdbc的事务

当碰到数据库操作的方法时,首先设置自动提交为false
然后一系列数据库操作方法的实际调用 , 最后一次性提交这些操作 就是这么简单


spring -> ioc+aop 其他的就是对一些框架 技术的封装 让你使用起来更加简单

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧