技术中心

这里象征着我们的态度和能力

>Spring JDBC事务 传播特性
发布者:中国IT实验室    信息来源:中国IT实验室    发布时间:2012-01-28      浏览次数:5457
分享到:

新浪微博

腾讯微博

QQ空间

豆瓣网

QQ好友

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

    Spring 和 JDBC 整合开发:(2)

    通过JDBC模板类 处理 异常

    处理 事务的传播特性

    处理事务的隔离性

@Transactional(noRollbackFor=RuntimeException.class)
     public void save(User user) throws Exception{
         // TODO Auto-generated method stub
            this.template.update("insert into user values(?,?)",
                   new Object[]{new Integer(user.getId()),user.getName()},
                   new int[]{java.sql.Types.INTEGER,java.sql.Types.VARCHAR});          
            System.out.println("插入成功....");  
            throw new RuntimeException();
     }

    我们制定了参数:noRollbackFor 所以 即使 遇到了运行期异常(nocheck异常)的时候 仍然不会回滚

    Spring默认的是 只是 运行期异常才会回滚但是 我们这里可以认为的指定哪些类 需要回滚事务

@Transactional(rollbackFor=Exception.class)
     public void save(User user) throws Exception{
         // TODO Auto-generated method stub
            this.template.update("insert into user values(?,?)",
                   new Object[]{new Integer(user.getId()),user.getName()},
                   new int[]{java.sql.Types.INTEGER,java.sql.Types.VARCHAR});          
            System.out.println("插入成功....");  
            throw new Exception();
     }

    此时 我们指定Exception异常要回滚 所以 执行结果是事务回滚了

    下面是 事务传播特性的 第一个例子:Required nerver给出代码:

@Transactional(propagation=Propagation.REQUIRED)
    public void save(User user) {
       // TODO Auto-generated method stub
            this.template.update("insert into user values(?,?)",
                 new Object[]{new Integer(user.getId()),user.getName()},
                 new int[]{java.sql.Types.INTEGER,java.sql.Types.VARCHAR});          
            System.out.println("插入成功....");    
            userdao_1.save(null);
    }

    代码二:

@Transactional(propagation=Propagation.NEVER)
    public void save(User user){
       // TODO Auto-generated method stub
            this.getTemplate().update("insert into user values(21,fasd)");
            System.out.println("插入成功....???????????????///");            
    }

    代码一 需要事务 当执行到dao层是 检测到没有事务 所以 就 给分配了事务:但是 嵌套了一个方法,代码二中的方法不需要事务PROPAGATION.NEVER但是 它运行在了事务环境中 所以 抛出异常

    因为 代码二:运行在代码一的事务环境中,出现了异常(此异常是RuntimeExcpetion的一个子类) 所以 全部回滚 一条数据 都没有插入进;

    强制:代码一:

@Transactional(propagation=Propagation.NEVER)
    public void save(User user) {
       // TODO Auto-generated method stub
            this.template.update("insert into user values(?,?)",
                 new Object[]{new Integer(user.getId()),user.getName()},
                 new int[]{java.sql.Types.INTEGER,java.sql.Types.VARCHAR});          
            System.out.println("插入成功....");    
            userdao_1.save(null);
    }

    代码二:

@Transactional(propagation=Propagation.MANDATORY)
    public void save(User user){
       // TODO Auto-generated method stub
            this.getTemplate().update("insert into user values(21,fasd)");
            System.out.println("插入成功....???????????????///");            
    }

    运行结果抛出异常:但是 代码一不需要事务 运行完SQL 就对数据库 修改了,但是代码二需要事务 但是运行在没有事务的环境下所以跑出了异常

    支持:

@Test
    public void save() throws Exception {
           BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");
           UserDAO dao =(UserDAO) bf.getBean("userdao");
           User user = new User();
           user.setId(11);
           user.setName("刘强");      
           dao.save(user);
    
    }

    代码一:

@Transactional(propagation=Propagation.NEVER)
    public void save(User user) {
       // TODO Auto-generated method stub
            this.template.update("insert into user values(?,?)",
                 new Object[]{new Integer(user.getId()),user.getName()},
                 new int[]{java.sql.Types.INTEGER,java.sql.Types.VARCHAR});          
            System.out.println("插入成功....");    
            userdao_1.save(null);
    }

    代码二:

    @Transactional(propagation=Propagation.SUPPORTS)
    public void save(User user){
       // TODO Auto-generated method stub
            this.getTemplate().update("insert into user values(22,fasd)");
            System.out.println("插入成功....???????????????///");            
    }

[1] [2] 下一页

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730