zoukankan      html  css  js  c++  java
  • Spring中的事务

    全局事务和本地事务

    1、全局事务

           基本的支持分布式事务;

           在业内,主要用来解决分布式事务的方案是使用柔性事务。柔性事务包括几种类型:两阶段型、补偿型、异步确保型和最大努力通知型。

      事务管理器控制着全局事务,管理事务生命周期,并协调资源。资源管理器负责控制和管理实际资源。在全局事务中,为了保证所有的操作可以一次性要么全提交,要么全失败。事务管理器和资源管理器之间的事务操作的控制是采用2PC(两阶段提交)来进行的。

    2、本地事务

           JDBC事务

     

    ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

    声明式事务和编程式事务

    1 public interface PlatformTransactionManager {
    2 
    3     TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    4 
    5     void commit(TransactionStatus status) throws TransactionException;
    6 
    7     void rollback(TransactionStatus status) throws TransactionException;
    8 }

    1、TransactionDefinition的说明

    •  隔离级别

    对应数据库中的隔离级别:http://www.cnblogs.com/bigshark/p/7912184.html

    ISOLATION_DEFAULT

    使用数据库的隔离级别

    ISOLATION_READ_UNCOMMITTED

    未提交读

    ISOLATION_READ_COMMITTED

    提交读

    ISOLATION_REPEATABLE_READ

    可重复读-Mysql默认级别

    ISOLATION_SERIALIZABLE

    可串行化

    • 传播行为

    PROPAGATION_REQUIRED

    方法必须运行在事务中,如果当前事务存在,方法会在当前事务运行,否则启动一个新事务。

    PROPAGATION_SUPPORTS

    方法不需要事务上下文,但是如果存在当前事务,则会在这个事务中运行。

    PROPAGATION_MANDATORY

    方法必须运行在事务中,如果当前事务不存在,则抛出异常。

    PROPAGATION_REQUIRES_NEW

    方法必须运行它自己的事务中,如果存在当前事务,事务将被挂起。

    PROPAGATION_NOT_SUPPORTED

    方法不应该运行在事务中,如果存在当前事务,事务将被挂起。

    PROPAGATION_NEVER

    方法不应该运行在事务上下文中,如果当前有事务在运行,则抛出异常。

    PROPAGATION_NESTED

    如果当前已经存在一个事物,方法会在嵌套事务中运行,嵌套事务可以独立提交或回滚;如果不存在事务,其行为和PROPAGATION_REQUIRED一样。

    • 超时设置setTimeout(int timeout),默认-1
    • 是否只读setReadOnly(boolean readOnly),默认false,事务告知对数据库只进行读操作,数据库可以利用事务的只读特性进行一些优化。
    • 回滚规则execute(TransactionCallback<T> action)。

    2、TransactionStatus提供所有事务API通用的,用来控制事务执行和事务状态查询的简单方法

     1 public interface TransactionStatus extends SavepointManager {
     2 
     3     boolean isNewTransaction();
     4 
     5     boolean hasSavepoint();
     6 
     7     void setRollbackOnly();
     8 
     9     boolean isRollbackOnly();
    10 
    11     void flush();
    12 
    13     boolean isCompleted();
    14 
    15 }

    3、PlatformTransactionManager的使用需要应用DataSource数据源,DataSourceTransactionManager支持JDBC和MyBatis场景。

    1 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    2     <property name="dataSource" ref="dataSource"/>
    3 </bean>

    Spring的声明式事务是通过Spring AOP实现的。

    调用事务代理的方法的过程:

     

    Spring提供两种编程式事务的方法:TransactionTemplate、PlatformTransactionManager

     

    资料

    Spring官方文档

    《Spring In Action》

  • 相关阅读:
    统一前后台数据交互格式
    volatile关键字 学习记录2
    利用AOP与ToStringBuilder简化日志记录
    JAVA的那些数据结构实现总结,实现,扩容说明
    JAVA中的数据结构
    对把JDK源码的一些注解,笔记
    分析下为什么spring 整合mybatis后为啥用不上session缓存
    JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌
    写颗搜索二叉树动动脑,开启今年的旅程,新年快乐
    内存快照排查OOM,加密时错误方法指定provider方式错误引起的OOM
  • 原文地址:https://www.cnblogs.com/bigshark/p/8025480.html
Copyright © 2011-2022 走看看