【1】Spring事务机制-基础

spring事务机制

0.优点

  1. 提供统一的API接口支持不同的资源
  2. 提供声明式事务管理
  3. 方便与spring框架集成
  4. 多个资源的事务管理、同步

1.事务抽象

  • PlatformTransactionManager(事务管理器)

public interface PlatformTransactionManager {
    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;

    void commit(TransactionStatus var1) throws TransactionException;

    void rollback(TransactionStatus var1) throws TransactionException;
}

 

  • TransactionDefinition(事务定义,包括事务隔离级别,事务传播机制)

public interface TransactionDefinition {
    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;

    int getPropagationBehavior();

    int getIsolationLevel();

    int getTimeout();

    boolean isReadOnly();

    @Nullable
    String getName();
}
  • TransactionStatus(事务的运行状态)

public interface TransactionStatus extends SavepointManager, Flushable {
    boolean isNewTransaction();

    boolean hasSavepoint();

    void setRollbackOnly();

    boolean isRollbackOnly();

    void flush();

    boolean isCompleted();
}

2.事务隔离机制

  1. TransactionDefinition.ISOLATION_DEFAULT  使用数据库的隔离级别
  2. TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读未提交,解决数据丢失,但会引起脏读
  3. TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读已提交,解决脏读,但不可重复读
  4. TransactionDefinition.ISOLATION_REPEATABLE_READ 可重复读,解决不可重复读,但存在幻读
  5. TransactionDefinition.ISOLATION_SERIALIZABLE 串行化

参考:Mysql的Innnodb四种隔离级别定义及实现

3.事务的传播机制

传播机制指的是:当一个事务方法A调用另一个事务方法B时,必须指定事务应该如何传播。(?到底在哪里指定,另一个方法又是如何承接)

事务传播机制一共有7个。

传播行为定义
TransactionDefinition.PROPAGATION_REQUIRED表示当前方法必须运行在事务中。如果A方法有事务即当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
TransactionDefinition.PROPAGATION_SUPPORTS表示支持事务,如果有当前事务,则继承;无事务,则无
TransactionDefinition.PROPAGATION_MANDATORY表示当前方法必须运行在事务中,如果有当前事务,则继承;无事务,则抛出异常
TransactionDefinition.PROPAGATION_REQUIRED_NEW如果存在当前事务,在该方法执行期间,当前事务会被挂起,会开启一个新的事务。因为数据库事务不支持嵌套,所以该级别一般只在JTA实现
TransactionDefinition.PROPAGATION_NOT_SUPPORTED表示当前方法不在事务中执行,如果有当前事务存在,则把当前事务挂起
TransactionDefinition.PROPAGATION_NERVER表示当前绝不在事务中执行,如果当前事务存在,则抛出异常
TransactionDefinition.PROPAGATION_NESTED表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。只能在JDBC3.0以上才能实现,通过savepoint来实现

required_new和nested的区别:

required_new是独立的两个事务,B事务回滚提交与A事务无关,则A回滚了但B可以提交。

嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

参考:spring事务管理(详解+实例)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值