EJB3中的事务

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。[code="java"]@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();

}

:o :o :o

附录
@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();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值