zoukankan      html  css  js  c++  java
  • 《Spring》(十八)---- 事务管理

    事务特性:

      原子性(Atomicity)/一致性(Consistency)/隔离性(Isolation)/持久性(Durability)

    隔离级别:

      Read Uncommitted: 一个事务可以读取另一个事务没有提交的更新结果。带来的问题:

        脏读,一个事务对数据进行了更新,但是没有提交,另一个事务看到了这个事务没有提交的更新结果,如果第一个事务回滚,那第二个事务看到的就是一笔脏数据。

        不可重复读,如果事物1在事务2的更新操作之前读取一次数据,在事务2的update操作之后再读取同一笔数据一次,两次结果是不同的。

        幻读,事务1要更新表中所有数据,同时,事务2向表中insert一行新数据。那么,操作第一个事务的用户发现表中还有没有修改的数据行,就是幻读。

        不可重复读重点是update,幻读重点是insert和delete。

      Read Committed:大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。可比避免脏读,但不可避免不可重复读和幻读。

      Repeatable Read:保证在整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。避免了脏读和不可重复读,但无法避免幻读。

      Serializable: 最为严格最为安全的隔离级别。可以避免所有问题。但性能最差。所以很少场景使用。

      通常情况,会使用其他隔离级别加上相应的并发锁的机制来控制对数据的访问,这样既保证系统性能不会损失太大,也能够在一定程度上保证数据的一致性。

      隔离级别与系统并发性成反比,与数据一致性成正比。

    事务参与者

      Resource Manager:简称RM,负责存储并管理系统数据资源的状态,如数据库服务器,JMS消息服务器等。

      Transaction Processing Monitor:简称TP monitor在分布式事务场景中协调包含多个Resource Manager的事务处理。

      Transaction Manager:简称TM,负责多个RM只见事务处理的协调工作。

      Application:以独立形式存在的或者运行于容器中的应用程序。

    事务分类:

      全局事务:整个事务处理过程中有多个RM参与(也就是涉及多个数据库服务器),那么就需要引入TP Monitor来协调多个RM之间的事务处理。通过TP Monitor的调配后,直接由TM统一协调。

      局部事务:当前事务只有一个RM参与。在当前事务中只对一个数据库进行更新。

      局部事务和全局事务的主要区分在于事务中涉及多少个RM,而不是系统中实际有多少个RM。

    Spring事务框架

    基本原则:让事务管理的关注点与数据访问关注点相分离。

    example:

    package com.ivy.Transaction;
    
    import org.springframework.dao.DataAccessException;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.TransactionDefinition;
    import org.springframework.transaction.TransactionStatus;
    
    public class FooService {
    
        private PlatformTransactionManager transactionManager;
        
        public PlatformTransactionManager getTransactionManager() {
            return transactionManager;
        }
    
        public void setTransactionManager(PlatformTransactionManager transactionManager) {
            this.transactionManager = transactionManager;
        }
    
        public void serviceMethod() {
            TransactionDefinition definition = ..;
            TransactionStatus txStatus = getTransactionManager().getTransaction(definition);
            try {
                // dao1.doDataAccess();
                // dao2.doDataAccess();
                // ...
            } catch(DataAccessException e) {
                getTransactionManager().rollback(txStatus);
                throw e;
            } catch(OtherNecessaryException e) {
                getTransactionManager().rollback(txStatus);
                throw e;
            }
            getTransactionManager().commit(txStatus);
        }
    }

    PlatformTransactionManager是Spring事务抽象框架的核心接口。定义如下: 

    public interface PlatformTransactionManager {
    
        
        TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    
        
        void commit(TransactionStatus status) throws TransactionException;
    
        void rollback(TransactionStatus status) throws TransactionException;
    
    }

    TransactionDefinition

    主要定义了可以指定的属性:

      事务的隔离级别:通常是ISOLATION_DEFAULT

      事务的传播行为:通常是PROPAGATION_REQUIRED, 即如果当前存在一个事务,则加入当前事务,如果不存在任何事务,则创建一个新的事务。

      事务的超时时间:TIMEOUT_DEFAULT, 默认为-1, 即采用当前事务系统默认的超时时间

      事务是否只读:对于一些查询来说,我们通常会希望它们采用只读事务。

  • 相关阅读:
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    OA办公系统 Springboot Activiti6 工作流 集成代码生成器 vue.js 前后分离 跨域
    java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    java 视频播放 弹幕技术 视频弹幕 视频截图 springmvc mybatis SSM
    最后阶段总结
    第二阶段学习总结
    第一阶段学习总结
  • 原文地址:https://www.cnblogs.com/IvySue/p/6638331.html
Copyright © 2011-2022 走看看