Spring事务详解

一、课程目标
     1、Spring事务管理的一组API
     2、Spring编程式事务
     3、Spring声明式事务


二、概念介绍
     1、事务:事务是指逻辑上一组操作,这组操作要么全部成功,要么全部失败。
     2、事务特性:ACID(原子性、一致性、隔离性、持久性)
          (1)原子性:不可分割的逻辑单元,事务中操作要么发生,要么不发生;
          (2) 一致性:事务前后数据的完整性必须保持一致;
          (3)隔离性:用户并发访问数据库时,多个事务之间相互独立,互不影响;
          (4)持久性:一个事务一旦提交,它对数据库中的改变就是永久性的。

三、事务管理的API介绍
    Spring事务管理器高层抽象主要有三个接口:
    1、PlatformTransactionManager事务管理器
          (1)Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现
               【1】使用Spring JDBC或MyBatis进行持久化数据时使用          
                 org.springframework.jdbc.datasource.DataSourceTransactionManager 
               【2】使用Hibernate3.0版本进行持久化数据时使用
                 org.springframework.orm.hibernate3.HibernateTransactionManager
               【3】使用JPA进行持久化数据时使用
                 org.springframework.orm.jpa.JpaTransactionManager
               【4】使用JDO进行持久化数据时使用
                 org.springframework.orm.jdo.JdoTransactionManager
               【5】使用一个JTA实现来管理事务,在一个事务跨越多个数据库时必须使用
                 org.springframework.transaction.jta.JtaTransactionManager

           (2)PlatformTransactionManager源码
public abstract interface PlatformTransactionManager
{
    public abstract TransactionStatus getTransaction(TransactionDefinition paramTransactionDefinition)
throws TransactionException;

    public abstract void commit(TransactionStatus paramTransactionStatus)
throws TransactionException;

    public abstract void rollback(TransactionStatus paramTransactionStatus)
throws TransactionException;
}
         
    (2)TransactionDefinition事务定义信息(隔离、传播、超时、只读)
          TransactionDefinition源码:
public abstract interface TransactionDefinition
{
// 事务传播行为:如果存在当前事务,则加入到当前事务中,否则新增一个事务
public static final int PROPAGATION_REQUIRED = 0;
// 事务传播行为:如果存在当前事务,则加入到当前事务中,否则以非事务方式执行
public static final int PROPAGATION_SUPPORTS = 1;
// 事务传播行为:如果存在当前事务,则加入到当前事务中,否则抛出异常
public static final int PROPAGATION_MANDATORY = 2;
// 事务传播行为:如果存在当前事务,则把当前事务挂起,新建一个新的事务
public static final int PROPAGATION_REQUIRES_NEW = 3;
// 事务传播行为:以非事务方式执行,如果存在当前事务,则挂起当前事务
public static final int PROPAGATION_NOT_SUPPORTED = 4;
// 事务传播行为:以非事务方式执行,如果存在当前事务,则抛出异常
public static final int PROPAGATION_NEVER = 5;
// 事务传播行为:如果存在当前事务,则嵌套执行事务。否则按TransactionDefinition.PROPAGATION_REQUIRED属性执行
public static final int PROPAGATION_NESTED = 6;

// 事务隔离性:默认数据库隔离级别(mysql:REPEATABLE_READ;oracle:READ_COMMITTED)
public static final int ISOLATION_DEFAULT = -1;
// 事务隔离性:读未提交,会产生脏读、重复读、幻读(场景:查询)
public static final int ISOLATION_READ_UNCOMMITTED = 1;
// 事务隔离性:读提交,会产生重复读、幻读(场景:修改)
public static final int ISOLATION_READ_COMMITTED = 2;
// 事务隔离性:重复读,会产生幻读(场景:插入)
public static final int ISOLATION_REPEATABLE_READ = 4;
// 事务隔离性:序列化,避免了脏读、重复读、幻读,事务按顺序执行,消耗资源,性能低
public static final int ISOLATION_SERIALIZABLE = 8;

// 事务超时时间设置,默认超时时间设置不生效
public static final int TIMEOUT_DEFAULT = -1;

// 获取事务传播行为
public abstract int getPropagationBehavior();
// 获取事务隔离级别
public abstract int getIsolationLevel();
// 获取事务超时时间设置
public abstract int getTimeout();
// 获取事务是否是只读状态
public abstract boolean isReadOnly();
// 获取事务名称
public abstract String getName();
}

    (3)TransactionStatus事务具体运行状态
          TransactionStatus源码:
public abstract interface TransactionStatus
extends SavepointManager, Flushable
{
// 事务状态:是否是一个新事务
public abstract boolean isNewTransaction();
// 事务状态: 返回这个事务是否在内部携带一个保存点, 也就是说,已经创建为基于保存点的嵌套事务。
public abstract boolean hasSavepoint();
// 事务状态:设置只回滚
public abstract void setRollbackOnly();
// 事务状态:是否设置只回滚状态
public abstract boolean isRollbackOnly();
// 事务状态:将底层会话刷新到数据存储(如果适用):例如,所有受影响的Hibernate / JPA会话。
public abstract void flush();
// 事务状态:是否完成了事务
public abstract boolean isCompleted();
}

四、事务总结
Spring将事务分成两类:
    (1)编程式事务
          TransactionTemplate事务模板
          手动编写事务代码,代码侵入性强(很少使用)
    (2)声明式事务
          【1】基于TransactionProxyFactoryBean方式
                   需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean代理或者增强
          【2】基于AspectJ的XML方式
                   一旦配置好之后,类上不需要添加任何东西
          【3】基于@Transactional注解方式
                   配置简单,需要在业务类上配置@Transactional注解


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值