• EJB>事务管理服务 小强斋


    最有用的容器服务可能就是事务管理服务,当应用出现失败或异常时,它保证了数据库的完整性。你可以简单地将为一个POJO 方法申明它的事务属性。这样容器就可以在合适的上下文中运行这个方法。最常见的事务是定义在session bean 的方法上,方法中所有的数据库操作只有在方法正常退出时才会提交,如果方法抛出未捕获的异
    常,事务管理将回滚所有的变更。@TransactionAttribute 注释用作定义一个需要事务的方法。它可以有以下参数:
    1.REQUIRED:方法在一个事务中执行,如果调用的方法已经在一个事务中,则使用该事务,否则将创建一个新的事务。
    2.MANDATORY:如果运行于事务中的客户调用了该方法,方法在客户的事务中执行。如果客户没有关联到
    事务中,容器就会抛出TransactionRequiredException。如果企业bean 方法必须用客户事务则采用Mandatory 属性。
    3.REQUIRESNEW:方法将在一个新的事务中执行,如果调用的方法已经在一个事务中,则暂停旧的事务。在调用结束后恢复旧的事务。
    4.SUPPORTS:如果方法在一个事务中被调用,则使用该事务,否则不使用事务。
    5.NOT_SUPPORTED:如果方法在一个事务中被调用,容器会在调用之前中止该事务。在调用结束后,容器会恢复客户事务。如果客户没有关联到一个事务中,容器不会在运行入该方法前启动一个新的事务。用
    NotSupported 属性标识不需要事务的方法。因为事务会带来更高的性能支出,所以这个属性可以提高性能。
    6.Never:如果在一个事务中调用该方法,容器会抛出RemoteException。如果客户没有关联到一个事务中,容器不会在运行入该方法前启动一个新的事务。
    package com.foshanshop.ejb3.impl;
    import java.util.List;
    import javax.ejb.Remote;
    import javax.ejb.Stateless;
    import javax.ejb.TransactionAttribute;
    import javax.ejb.TransactionAttributeType;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    import com.foshanshop.ejb3.TransException;
    import com.foshanshop.ejb3.TransactionDAO;
    import com.foshanshop.ejb3.bean.Product;
    @Stateless
    @Remote ({TransactionDAO.class})
    
    
    public class TransactionDAOBean implements TransactionDAO {
    @PersistenceContext
    protected EntityManager em;
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void insertProduct(String name, Float price, boolean error) {
    try {
    for(int i=0;i<3; i++){
    Product product = new Product(name+i,price*(i+1));
    em.persist(product);
    }
    if (error) new Float("kkk"); //制造一个例外
    } catch (Exception e) {
    throw new RuntimeException ("应用抛出运行时例外,为了使事务回滚,外部不要用try/catch
    包围");
    
    }
    }
    
    
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void ModifyProductName(String newname, boolean error) throws Exception {
    Query query = em.createQuery("select p from Product p");
    List result = query.getResultList();
    if (result!=null){
    for(int i=0;i<result.size();i++){
    Product product = (Product)result.get(i);
    product.setName(newname+ i);
    em.merge(product);
    }
    if (error && result.size()>0) throw new TransException ("抛出应用例外");
    }
    }
    }
  • 相关阅读:
    什么是理想?
    leetcode 62. 不同路径-动态规划及优化,双100%
    使用双指针暴力解决力扣28题《实现 strStr()》
    使用双指针解决力扣27题《移除元素》
    SQL SERVER 数据库日志已满时清理日志的方法
    修改git提交的名字和邮箱
    React Native运行出现Could not find "iPhone X" simulator
    eosio 编译与部署
    恢复经常写博客的习惯
    MAC OS系统替换homebrew使用阿里云或中科大的镜像源
  • 原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5637646.html
Copyright © 2020-2023  润新知