这个问题一直没有搞清楚。操作EJB的时候,事务都是EJB容器启动的,大部分都是涉及到数据库操作的时候才会用事务,但是二者又有什么关联呢?

解决方案 »

  1.   

    容器提供了EJB服务,同时也提供了transaction支持。
    网上介绍很多。
      

  2.   

    EJB 组件的事物处理一般是采用 JTA 事务。JTA 事务必须由 Java EE 应用服务器来管理,JTA 事务是一种分布式事务 API,其与我们通常所称的本地事务,也就是 JDBC Connection 事务有很大的不同。Connection 事务只能针对于一个数据库连接,如果一个方法中同时操作了两个数据库中的表,那么 Connection 对这样的事务需求就无能为力了,因为 Connection 只能管理一个数据库的连接。对于这种跨数据源的事务处理,目前在 Java 中一般使用 JTA 来进行处理,但是 JTA 并不能运行在 Java SE 环境中,也不能运行在 Servlet 容器中,其只能运行在 Java EE 应用服务器中。对于这种跨数据源式的事务处理,其数据库本身需要能够支持所谓的“两阶段提交协议”(通常称为“2-PC”,可以去 Google 上寻找一些相关资料),2-PC 需要有个中间协调者,而这个中间协调者就是 Java EE 应用服务器。
      

  3.   

    Java EE 容器所管理的数据源需要绑定在 JNDI 上,因此 Java EE 容器在启动时就对其进行了初始化。一个数据库我们可以看作是对应于一个数据库的连接源,数据源指的是绑定在 JNDI 上实现了 javax.sql.DataSource 的对象。Java EE 容器可以从 JNDI 的某个 DataSource 中获得 Connection 注入到 JPA 的 EntityManager 或者 Entity Bean 中去。如果当前数据库事务是采用 JTA 的话,那么 EJB 中所使用到的 JTA 事务的 javax.transaction.UserTransaction 对象也必须从 JNDI 中获得。