`
feng88724
  • 浏览: 172800 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

EJB3中的事务

    博客分类:
  • EJB
阅读更多
1.容器管理事务(CMT)
①. 在EJB3中,Session Bean 默认受CMT管理。
当然伱也可以手动用
@TransactionManagement(TransactionManagementType.CONTAINER)
注释来声明使用CMT。
②. 事务属性,在EJB中,对于Session Bean,支持所有6种属性,但对于Message Driven Bean,只支持其中两种属性(REQUIRED、NOT_SUPPORTED),事务属性可以用
]@TransactionAttribute(TransactionAttributeType.REQUIRED)[/code注释来声明。
Transaction Attribute    	Caller Transaction Exists?      	Effect
REQUIRED             	No                          	Container creates a new transaction.
Yes                         	Method joins the caller’s transaction.
REQUIRES_NEW 			No 						Container creates a new transaction.
Yes	Container creates a new transaction and the caller’s transaction is suspended.
SUPPORTS 			No 						No transaction is used.
Yes 						Method joins the caller’s transaction.
MANDATORY 			No 						javax.ejb.EJBTransactionRequired-
Exception is thrown.
Yes 						Method joins the caller’s transaction.
NOT_SUPPORTED 		No				 		No transaction is used.
Yes 	The caller’s transaction is suspended and the method is called without a transaction.
NEVER 				No 						No transaction is used.
Yes 						javax.ejb.EJBException is thrown.

③.	设置rollback
EJB里,在使用CMT的情况下,想要rollback只能sessionContext.setRollbackOnly(),或者抛出EJBException。
@Resource
private SessionContext context;
public void placeSnagItOrder(Item item, Customer customer){
try {
...
} catch (Exception cve) {
context.setRollbackOnly();
...



2. Bean管理事务(BMT)
①. 使用
@TransactionManagement(TransactionManagementType.BEAN)
注释来声明使用BMT。
②. 可用
@TransactionAttribute(TransactionAttributeType.REQUIRED)
注释来声明事务属性。
③. 注入UserTransaction
a)	JNDI lookup
Context context = new InitialContext();
UserTransaction userTransaction =
(UserTransaction) context.lookup("java:comp/UserTransaction");

b) EJBContext
i.	@Resource
private SessionContext context;
...
UserTransaction userTransaction = context.getUserTransaction();

ii.	@Resource 
private UserTransaction userTransaction;

④. 使用UserTransaction
Try{
userTransaction.begin();
…	
userTransaction.commit();
}catch(Exception e){
userTransaction.rollback();
…
}

  

附录
@TransactionManagement(TransactionManagementType.BEAN)
public @Stateless class HelloServiceBean implements HelloService {
	@EJB (beanName="chinaHelloImple") chinaHelloLocal chinaDAO;
	@EJB (beanName="LogWriterBean") LogWriter log;

	 public void hello(){
		System.out.println("-----------------Hello Service------------------");
		chinaDAO.sayHello();
		
		System.out.println("-----------------Hello Service over------------------");
	}
//方式一(注意:必须要用 @Resource 注入ctx,否则有空指针异常 )
	 @Resource
	 private EJBContext ctx;
	 private UserTransaction utxc;
//方式二(注意:必须要用 @Resource 注入,否则有空指针异常 ) 《方法二比较简单》
//	 @Resource
//	 private UserTransaction utxc;
	 public void insert(Person p){
		try {
			utxc = (UserTransaction)ctx.getUserTransaction();
//			InitialContext initCtx = new InitialContext();
//	        utxc = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");
			utxc.begin();
			chinaDAO.insertPerson(p);
			LogEntry logContent = new LogEntry();
			logContent.setLevel("OK");
			logContent.setMessage("insert person");
			logContent.setPerson(p);
			
			JMSRequestReply r = new JMSRequestReply();
			String flag = r.send(logContent);
			System.out.println("---------------JMS to CSV提交-----------------Result:"+flag);
//			此处也需要使用JMS来进行数据库操作
			log.add(logContent);
			
			utxc.commit();
		}catch(Exception rt){
			System.out.println("---------------新增人员失败,回滚-----------------");
				try {
					//没有rollback,也能回滚,但会报错
					utxc.rollback();
				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SystemException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			rt.printStackTrace();
//			ctx.setRollbackOnly();
		}
}
分享到:
评论

相关推荐

    ejb3.0 分布式事务

    EJB3.0中,事务管理分为容器管理的事务(CMT, Container-Managed Transactions)和 bean 管理的事务(BMT, Bean-Managed Transactions)。CMT是默认模式,由容器自动管理事务的开始、提交、回滚,开发者只需关注...

    EJB与事务 -详细描述EJB和事务

    3. Supports:如果调用者正在进行事务,EJB方法可以选择加入;如果没有事务,EJB方法不会启动新的事务。 4. RequiresNew:无论调用者是否有事务,容器都会为EJB方法创建一个新的独立事务,方法执行完毕后,新事务会...

    EJB的事务属性

    3. **Mandatory**:要求调用方必须在一个事务中。如果调用方不在事务中,EJB容器将抛出`TransactionRequiredException`异常。这适用于那些依赖于事务上下文的EJB方法,如只读查询。 4. **NotSupported**:无论调用...

    oracle-mysql 两阶段提交例子(ejb3)

    在EJB3中,容器管理事务(Container Managed Transactions, CMT)模式下,事务的边界由容器自动管理,这使得开发者可以更加专注于业务逻辑的编写。 #### 二、EJB3中的事务管理 在EJB3中,事务管理有两种模式:容器...

    EJB3-JBOSS7-分布式事务示例

    在EJB3中,分布式事务处理是通过JTA(Java Transaction API)和JTS(Java Transaction Service)来实现的。当多个数据源或服务参与同一个事务时,就需要跨系统的事务协调,确保数据的一致性。在JBoss AS7中,可以...

    EJB3 PPT教程

    在EJB3中,SessionBean变得更加轻量级,不再需要XML配置,而是通过注解实现。你可以学习如何定义SessionBean接口、实现类,并使用`@Stateless`或`@Stateful`注解来指定其状态行为。 **二、EntityBean** EntityBean...

    ejb3 带源码

    通过阅读这些资源,开发者可以深入了解EJB3的原理、最佳实践,并掌握如何在实际项目中有效地使用EJB3组件,提升企业级应用开发的能力。同时,源码分析能帮助开发者更好地理解EJB3的运行机制,从而在实践中得心应手。

    EJB3基础教程

    EJB3中的容器管理的事务(CMT)允许开发者无需关心事务的开始、提交或回滚,这些都由EJB容器自动处理。开发者只需在方法上添加`@TransactionAttribute`注解来指定事务的属性。 ### 6. 容器服务 EJB3提供了一系列的...

    EJB3开发Entity

    本文将深入探讨EJB3中的Entity Bean,它是EJB3中的持久化组件,用于代表数据库中的实体。 1. **实体Bean的概念** 实体Bean是EJB3中的数据存储模型,它与数据库中的记录相对应。在EJB3中,实体Bean不再需要编写...

    EJB3规范 简体中文

    ### EJB3规范简体中文版关键知识点解析 #### 一、引言 EJB (Enterprise JavaBeans) 是 Java 平台为企业级应用程序提供的一种组件模型。随着技术的发展,EJB 经历了多个版本的迭代,其中 EJB 3.x 版本引入了大量的...

    ejb3进阶案例

    在ejb3中,可以使用`EntityManager`和`EntityTransaction`来处理数据库操作,如CRUD(创建、读取、更新、删除)操作。ejb3的实体管理器提供了事务管理和懒加载等功能,大大提高了开发效率。 **3. MessageDriven ...

    EJB3应用实例

    4. **实体bean(Entity Beans)**:EJB3中的实体bean通常对应数据库中的记录,它们可以是容器管理的持久化(CMP)或Bean管理的持久化(BMP)。`@Entity`注解标记实体类,`@Table`定义映射的数据库表,`@Id`定义主键...

    EJB3入门例子

    1. **注解驱动(Annotation-based)**:在EJB3中,开发者可以使用注解来声明组件的角色、生命周期方法和持久化属性,如`@Entity`、`@Stateless`、`@Stateful`、`@SessionBean`等,大大减少了XML配置文件的使用。...

    EJB 3实战 带书签

    EJB 3中最大的改进之一是注解的广泛应用,如@Entity、@Stateless、@PersistenceContext等,这些注解大大减少了XML配置文件的使用,简化了企业组件的开发。除了注解,EJB 3还引入了依赖注入的概念,使得组件间的耦合...

    EJB3中MessageDrivenBean知识

    **EJB3中MessageDrivenBean知识** 在Java企业级应用开发中,Enterprise JavaBeans(EJB)是一个核心组件,用于构建可伸缩、安全且事务处理能力强的分布式应用程序。EJB3是EJB规范的一个重要版本,引入了许多改进,...

    EJB3 实例练习(一)

    在EJB3中,实体bean通常用于表示数据库中的记录。通过使用`@Entity`注解,我们可以将Java类声明为实体bean。`@Table`注解用于指定对应的数据库表,而`@Id`注解则标记主键字段。EJB3的JPA(Java Persistence API)...

    EJB3(入门经典简版)

    总的来说,EJB3是Java企业开发中的强大工具,它提供了全面的解决方案,从数据库管理到事务处理,再到安全性,都为开发者提供了便利。通过学习EJB3,开发者能够构建出高效、稳定的企业级应用。阅读《EJB3(入门经典的...

    ejb3-persistence

    【ejb3-persistence】是Java企业版(Enterprise JavaBeans,EJB)3.0规范中的持久化模块,它是Java后端开发中的一个重要组件,主要处理数据库操作和对象关系映射(Object-Relational Mapping,ORM)。在Spring框架中...

Global site tag (gtag.js) - Google Analytics