无道
2003-10-30 17:21

说穿了就不会觉得神奇了( 有点像变魔术:-) ),这是由JTA服务器内部实现的,我可以说一下大致的原理(远程事务的部分就不说了(说来话长))。

当调用begin时,创建一个新事务,并将其放入事务池(是一个Map对象)中,其键值就是线程对象。大概是这样的:TransactionManager.getTranactionPool().put(System.currentThread(),new TransactionObject());

当事务资源如会话Bean需要用到当前事务对象时,就调用

TransactionManager.getTranactionPool().get(System.currentThread());来获得。

这也就是为什么EJB容器规定不能在容器中启动新线程的原因之一了(因为容器不好控制(也不是不可能)事务在新线程中传播)。

difficult
2003-10-30 17:41

高人呀,谢谢。

还有能不能提供这方面的资料

无道
2003-10-30 17:57

jta规范有提到,但没有涉及具体实现。

http://java.sun.com/products/jta/ 这里下载规范

mypine
2003-11-06 11:43

Yes, you are right, The transaction manager will automated create a transaction object when we invoke the ut.begin(), then will put the current thread handle and the object to the map.

Ok, now, anyone object in current thread can use the transaction object through thread handle, and can deliver a true-

false result to the transaction object.

mep
2003-11-06 14:34

在CORBA的OTS中,事物通过在网络请求中传输事物ID,将事物标示从客户端传送到服务器端,那么在EJB/JTA中,是如何将事物标示在网络中传送的?