Spring特性介绍-事务机制

2022-02-17  本文已影响0人  洛神灬殇

概念介绍

 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注解
上一篇下一篇

猜你喜欢

热点阅读