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

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

原文地址:https://www.cnblogs.com/IvySue/p/6638331.html