J2EE里的事务一问(必须用EJB才能用JTA吗?)

我们要使用容器的事务功能,一般都是在EJB(SESSION BEAN或ENTITY BEAN)
里写如下代码:
javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");
tx.begin();
......
tx.commit();

我想问的是,如果我不想用EJB,能不能在普通的BEAN里这样来
用事务呢?
因为我的应用是跨两个数据库,但我不想用EJB
我的APP SERVER是WEBLOGIC 8.1

EJB中不必写入事务语句,你之前在EJb中加入JTA用法是错误的。

用普通JavaBeans倒是应该写入JTA这条语句,但是请注意,事务自己处理是非常复杂,因为涉及Lock问题,会发生自己搞自己非常烦琐的问题,几乎现在全世界程序员中处理多个事务Lock问题的人不多。

你可以看看所有Web的开源代码,几乎看不到他们中有JTA语句,因为他们都不需要事务,如果你需要事务,又不想成为稀缺的程序员。

建议你还是使用EJB,因为它自动帮助你实现了事务。

你说“EJB中不必写入事务语句,你之前在EJb中加入JTA用法是错误的。”

如果我不用容器管理事务,那当然需要在EJB按照我的方法来处理事务。
而且,很重要的一点是,很多大项目,都是我这么写的,而不会用
容器来管理事务
包括我们现在给银行做的系统(1000多万的一个核心系统)

------------------------------------------------------------
有没有人研究过,不使用EJB,怎么来处理事务的问题呢?
我们很想用Spring,但不想把EJB弄到Spring里,又面临
事务处理的问题。

我想问一下,嵌套事务如何使用呢?能给一小段代码看看么?谢了先!

未必,我认为SUN的JTA只是OTS的一部分,如果你熟悉corba的OTS规范,使用其提供的API可以完成分布式对象的事物处理.但这样做的前提是你必须要手工提供中间件的事务服务,即SUN专为容器厂商提供的JTS API,如此以来
你的作为服务端的普通BEAN,(因为你不使用EJB容器),必须通过调用JTS API来提供事务,那么客户段的BEAN就可以调用JTA来启动/终止事务,但这样
做的后果和可靠性是显而易见的.我认为你还是使用中间件来完成事务

对,用中间件来完成这个工作是非常合适
问题是,我现在想确定的是,只用BEAN来完成的话
会有什么问题和限制

因为仅仅为了事务这么一个目的而去使用EJB的话,
我觉得是不是有点过了

因为,我觉得,既然事务是由容器来负责,
而不是由SESSION BEAN来负责的,那么,
我的普通BEAN,部署在容器上,为什么不能直接使用事务呢?

我觉得是可以的,在Sean C. Sullivan 的Advanced DAO programming一文中的JTA例子就没用EJB。这篇文章在IBM的网站上有。

hibernate中也可以使用JTA来控制事务,JTA并非EJB专有。

使用容器管理事务的情况下,不能处理嵌套事务,所以只能智能自己在代码中控制,但是,好像j2ee中无法实现嵌套事务,不知我的理解对不对

EJB中不支持嵌套事务,这点在《Mastring EJB》和《The J2EE Tutorial》中都指出了。

不会吧,EJB中不支持嵌套事务,那它还有什么存在价值?

谁知道在j2ee下如何实现嵌套事务呀

我记得:ejb支持的是平面事务,而平面事务和嵌套事务是对立的,平面事务要求各个事务是独立的,在一个事务中是不能启动另一个事务的,所以,对于嵌套事务,如果采用j2ee的话,还要从应用逻辑上重新组织事务,将嵌套事务用平面事务代替才行
我的理解对吗

flat transaction大多数情况下已经够用了,就是说能够保证ACID。nested transaction只不过使得事务管理更加灵活和有效。