• 《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, 即采用当前事务系统默认的超时时间

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

  • 相关阅读:
    Matrix Power Series
    Recursive sequence HDU5950
    P2151 [SDOI2009]HH去散步
    P4273 [NOI2004] 降雨量
    P1034 [NOIP2002 提高组] 矩形覆盖
    P1027 [NOIP2001 提高组] Car 的旅行路线
    Win10使用Dism++离线安装.Net3.5
    WPF之模板
    WPF之资源
    WPF之命令
  • 原文地址:https://www.cnblogs.com/IvySue/p/6638331.html
Copyright © 2020-2023  润新知