JTS和线程的问题,一言难尽,在google里查一查吧
解决方案 »
- 在线等。如下图。SSH全套注解的方式框架。不知道是不是beans.xml文件的错误。但是找不到错误的地方。求解
- 谁有好的项目要做吗?我想用jsp+mysql做网站,推荐一下项目吧
- Netbeans 6.8下关于Hibernate的配置使用
- 求救!!!
- 高分求教xfire 发布,调用webservice问题
- hibernate能用get返回一个对象,但用load就是null,为什么呢?
- struts错误提示不建议使用的类型,求教
- 想学J2EE,请高手推荐一本入门的书
- 用Web Services怎么样验证用户身份登陆?小弟不才,请各位大虾指点。
- 为何rollback不了?
- 集思广义:关于JAVA技术的研发的方向,请各位提出方向的同时,指出他的应用面,优势劣势等!
- javamail如何显示比较复杂的html邮件
当调用begin时,创建一个新事务,并将其放入事务池(是一个Map对象)中,其键值就是线程对象。大概是这样的:TransactionManager.getTranactionPool().put(System.currentThread(),new TransactionObject());
当事务资源如会话Bean需要用到当前事务对象时,就调用
TransactionManager.getTranactionPool().get(System.currentThread());来获得。这也就是为什么EJB容器规定不能在容器中启动新线程的原因之一了(因为容器不好控制(也不是不可能)事务在新线程中传播)。
在JBoss里,你提到的应用是这样实现的:
首先,你要明确:你用到到的那几个bean位于同一个容器中(跨容器的事务传播JBoss3.x不支持,JBoss4.x我不懂),那么这几个bean的调用将位于同一个线程中。
而事务管理器TxManager使用了ThreadLocal类型的变量来保存特定线程的事务信息(包括事务对象),这样那几个位于同一线程的调用就共有了同一个事务对象,也就是说被纳入到同一个事务了。就着么简单!因为在取得资源时判断当前是否有事务的方式,就是判断TxManager中的ThreadLocal变量是否保存了事务对象。
而对于客户端调用EJB方法时的事务传播,因为事务对象其实是存在于容器中的,所以客户端只需在调用EJB方法时顺带捎上事务的全局ID,容器根据改ID取出相应的事务对象,就将客户端和EJB方法纳入到同一个事务中了。这其实是一种变形的跨JVM传播事务,但不是真正的跨JVM传播事务。
说得不错