zoukankan      html  css  js  c++  java
  • JPA的事务注解@Transactional使用总结(转)

    转自:http://www.cnblogs.com/taven/p/5942384.html

    在项目开发过程中,如果您的项目中使用了Spring的@Transactional注解,有时候会出现一些奇怪的问题,例如:

    明明抛了异常却不回滚?

    嵌套事务执行报错?

    ...等等

    很多的问题都是没有全面了解@Transactional的正确使用而导致的,下面一段代码就可以让你完全明白@Transactional到底该怎么用。

    直接上代码,请细细品味

    @Service
    public class SysConfigService {
    
        @Autowired
        private SysConfigRepository sysConfigRepository;
        
        public SysConfigEntity getSysConfig(String keyName) {
            SysConfigEntity entity = sysConfigRepository.findOne(keyName);
            return entity;
        }
        
        public SysConfigEntity saveSysConfig(SysConfigEntity entity) {
            
            if(entity.getCreateTime()==null){
                entity.setCreateTime(new Date());
            }
            
            return sysConfigRepository.save(entity);
                    
        }
        
        @Transactional
        public void testSysConfig(SysConfigEntity entity) throws Exception {
            //不会回滚
            this.saveSysConfig(entity);
            throw new Exception("sysconfig error");
            
        }
        
        @Transactional(rollbackFor = Exception.class)
        public void testSysConfig1(SysConfigEntity entity) throws Exception {
            //会回滚
            this.saveSysConfig(entity);
            throw new Exception("sysconfig error");
            
        }
        
        @Transactional
        public void testSysConfig2(SysConfigEntity entity) throws Exception {
            //会回滚
            this.saveSysConfig(entity);
            throw new RuntimeException("sysconfig error");
            
        }
        
        @Transactional
        public void testSysConfig3(SysConfigEntity entity) throws Exception {
            //事务仍然会被提交
            this.testSysConfig4(entity);
            throw new Exception("sysconfig error");
        }
        
        @Transactional(rollbackFor = Exception.class)
        public void testSysConfig4(SysConfigEntity entity) throws Exception {
            
            this.saveSysConfig(entity);
        }
        
        
        
    }

    总结如下:

         /**
             * @Transactional事务使用总结:
             * 
             * 1、异常在A方法内抛出,则A方法就得加注解
             * 2、多个方法嵌套调用,如果都有 @Transactional 注解,则产生事务传递,默认 Propagation.REQUIRED
             * 3、如果注解上只写 @Transactional  默认只对 RuntimeException 回滚,而非 Exception 进行回滚
             * 如果要对 checked Exceptions 进行回滚,则需要 @Transactional(rollbackFor = Exception.class)
             * 
             * org.springframework.orm.jpa.JpaTransactionManager
             * 
             * org.springframework.jdbc.datasource.DataSourceTransactionManager
             * 
             * org.springframework.transaction.jta.JtaTransactionManager
             * 
             * 
             * 
             */
  • 相关阅读:
    eclipse导入github项目
    深入理解BFC和Margin Collapse
    前端开发必备!Emmet使用手册
    Backbone.js的技巧和模式
    智能选择器和语义化的CSS
    IE常见BUG总结(持续更新)
    表格元素的完全指南(译)
    display:inline-block;在各浏览器下的问题和终极兼容办法
    float的深入剖析
    javascript正则表达式小技巧
  • 原文地址:https://www.cnblogs.com/jyluo03/p/8416541.html
Copyright © 2011-2022 走看看