资讯专栏INFORMATION COLUMN

Spring事务管理

TalkingData / 1050人阅读

摘要:事务的传播行为当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。事务配置配置文件中关于事务配置总是由三个组成部分,分别是和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

数据库事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommittedRead committedRepeatable readSerializable

脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×
脏读 一个事务读取到了另一个事务改写但未提交的数据,如果这些数据被回滚,则读到的数据是无效的
不可重复读 在同一个事务中,多次读取同一数据返回的结果不同。也就是说,后续读取可以读到另一事务已提交的更新数据
幻读 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务的传播行为

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。

事务传播行为类型 说明
PROPAGATION_REQUIRED 支持当前事务,如果不存在,就创建一个(默认的传播行为)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,就抛出异常
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行, 如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,就嵌套事务执行(只对DataSourceTransactionManager起效)

总结下就是:

支持当前事务: REQUIRED、SUPPORTS、MANDATORY (删除订单、删除用户 )
不支持当前事务:REQUIRES_NEW、NOT_SUPPORTED、NEVER (ATM取款、打印凭条 )
嵌套事务:NESTED ,使用Jdbc Connection SavePoint技术,允许在事务过程中回滚到某个保存点,只对DataSourceTransactionManager 有效

Spring事务管理的两种方式
编程式事务管理

在程序代码中,加入事务管理代码,有代码侵入事务管理方式 ,现在很少使用,不方便,灵活性较差
1)在spring 配置TransactionManager 事务管理器
2)将TransactionManager对象 注入 TransactionTemplate对象
3)将TransactionTemplate对象 注入 应用代码中
4)添加事务控制

transactionTemplate.execute(new TransactionCallbackWithoutResult(){
    doInTransaction(){
        //添加被事务管理的代码 
    }
});
声明式事务管理

底层原因,使用Spring AOP 思想,环绕通知增强,在不修改源目标代码情况下,动态添加功能增强

try {
    //开启事务
    //被事务管理代码
    //提交事务
}catch{
    //回滚事务
}

声明式事务管理,不需要改动目标代码,灵活性更强,更便于使用。

Spring事务配置

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。参考下图

根据代理机制的不同,共有5中配置方式

1. 每个Bean都有一个代理



      
          
        
      

      
    
        
    
    
    
    
        
    
    
      
             
                
          
         
          
          
              
                PROPAGATION_REQUIRED
              
          
      
2. 所有Bean共享一个代理基类



      
          
        
      

      
    
        
    
    
      
          
          
          
          
              
                PROPAGATION_REQUIRED  
              
          
        
   
    
    
        
    
    
      
           
    
3. 使用拦截器



      
          
        
      

      
    
        
     
   
      
          
          
          
              
                PROPAGATION_REQUIRED  
              
          
    
      
      
          
              
                *Dao
              
          
          
              
                transactionInterceptor  
              
          
      
  
    
    
        
    
4. 使用tx标签配置的拦截器



    
    

      
          
        
      

      
    
        
    

    
        
            
        
    
    
    
        
                
          
5. 使用全注解



    
    

    

      
          
        
      

      
    
        
    
    

此时在DAO上需加上@Transactional注解,如下:

package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    public List listUsers() {
        return this.getSession().createQuery("from User").list();
    }
    
    
}

http://singo107.iteye.com/blo...
http://blog.csdn.net/it_man/a...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70311.html

相关文章

  • 15个经典的Spring面试常见问题

    摘要:我自己总结的学习的系统知识点以及面试问题,已经开源,目前已经。目前最新的版本中模块的组件已经被废弃掉,同时增加了用于异步响应式处理的组件。每一次请求都会产生一个新的,该仅在当前内有效。显而易见,这种模式存在很多问题。 我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 41k+ Star。会一直完善下去,欢迎建议和指导,同时也欢迎Star: https://githu...

    sarva 评论0 收藏0
  • Spring学习笔记

    摘要:介绍并不局限于某一层是对象的容器帮我们管理项目中的所有对象搭建导包直接新建项目,一般的都有,除了依赖准备类书写配置书写代码测试中的概念反转控制创建对象的方式反转了从我们自己创建对象反转给程序来创建依赖注入将必须的属性注入到对象当中是实现思想 1.spring介绍 spring并不局限于某一层.spring是对象的容器,帮我们管理项目中的所有对象 2.spring搭建 1.导包(idea...

    FleyX 评论0 收藏0
  • Spring框架之我见(三)——IOC、AOP

    摘要:模块负责的所有面向切面的功能。总结的统一管理,降低了对象之间的耦合对主流的框架提供了很好的集成支持提供众多组件,事务管理,等具有高度可开放性,开发者可以自由选择部分或全部主要使用工厂模式和代理模式。 聊完了Spring框架中最重要的两种设计模式,我们来看一下Spring框架的模块和结构图。 Spring框架的结构 下图是Spring官方给出的Spring框架的结构图。 showImg(...

    khs1994 评论0 收藏0
  • Spring笔记04_AOP注解开发_模板_事务

    摘要:后置增强周杰伦环绕通知在切面类中添加以下方法环绕通知环绕前增强环绕前增强测试前置增强保存订单。。。不使用事务管理。 1. Spring基于AspectJ的注解的AOP开发 1. 1 SpringAOP的注解入门 创建项目,导入jar包 需要导入Spring基础包4+2 需要导入AOP联盟包、AspectJ包、Spring整合Aspect包Spring-aop包 Spring整合单...

    youkede 评论0 收藏0
  • Spring Boot 参考指南(使用JTA分布式事务

    摘要:使用事务管理器是支持的一个流行的开源事务管理器实现,你可以使用启动器向项目添加适当的依赖项,与和一样,将自动配置并对进行后处理,以确保启动和关闭顺序是正确的。 37. 用JTA分布式事务 通过使用Atomikos或Bitronix嵌入式事务管理器,Spring Boot支持跨多个XA资源的分布式JTA事务,在部署到合适的Java EE应用服务器时也支持JTA事务。 当检测到JTA环境时...

    silenceboy 评论0 收藏0
  • MyBatis集成Spring

    摘要:各方面有各种常见的良好示例,包括日志记录,声明式事务,安全性,缓存等。声明式事务管理这意味着你从业务代码中分离事务管理。但作为一种横切关注点,声明式事务管理可以使用方法进行模块化。支持使用框架的声明式事务管理。 本章主要内容包括Spring简介、Spring的两大特性(IOC和AOP)、事务MyBatis集成Spring等。也许有读者会疑惑,明明是MyBatis-Plus实战,怎么还讲...

    ckllj 评论0 收藏0

发表评论

0条评论

TalkingData

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<