文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring事务处理Transactional和并发线程的方法是什么

2023-06-22 07:10

关注

本篇内容介绍了“Spring事务处理Transactional和并发线程的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Spring事务传播机制和数据库隔离级别

在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。

隔离级别更新丢失脏读取重复读取幻读
未授权读取NYYY
授权读取NNYY
可重复读取NNNY
串行NNNN

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

package org.springframework.transaction.annotation;import org.springframework.transaction.TransactionDefinition; public enum Propagation {         REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),         SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),         MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),         REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),         NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),         NEVER(TransactionDefinition.PROPAGATION_NEVER),         NESTED(TransactionDefinition.PROPAGATION_NESTED);      private final int value;      Propagation(int value) { this.value = value; }     public int value() { return this.value; } }
 package org.springframework.transaction; import java.sql.Connection; 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 = Connection.TRANSACTION_READ_UNCOMMITTED;         int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;         int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;         int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;          int TIMEOUT_DEFAULT = -1;          int getPropagationBehavior();         int getIsolationLevel();         int getTimeout();         boolean isReadOnly();         String getName(); }

PROPAGATION_REQUIRES_NEW :

启动一个新的, 不依赖于环境的 "内部" 事务.

这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行.

PROPAGATION_NESTED :

如果外部事务 commit, 嵌套事务也会被 commit;

如果外部事务 roll back, 嵌套事务也会被 roll back 。

开始一个 "嵌套的" 事务, 它是已经存在事务的一个真正的子事务. 嵌套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 嵌套事务是外部事务的一部分, 只有外部事务结束后它才会被提交.

代码例子:

@Transactional(propagation=Propagation.NESTED)@Transactional(propagation=Propagation.PROPAGATION_REQUIRES_NEW)  ServiceA{  @Autowired  ServiceB serviceB;  @Transactional(propagation=Propagation.NESTED)  public void method1(){    serviceB.method2();    int i = 1/0;  }} ServiceB{  @Transactional(propagation=Propagation.NESTED)  public void method2(){   xxxxxx  }}

因为method1使用 @Transactional(propagation=Propagation.NESTED),当执行method1时,会抛出异常,method2()也会被回滚;

如果method2()用PROPAGATION_REQUIRES_NEW:

ServiceB{@Transactional(propagation=Propagation.PROPAGATION_REQUIRES_NEW)  public void method2(){   xxxxxx  }}

那么method2不会因为method1抛出异常而回滚。

不管是什么类型的嵌套事务,一个线程只有一个事务,线程结束的时候才提交事务,包括嵌套事务,即使嵌套事务是REQUIRES_NEW,也不是嵌套事务的方法结束就提交事务的,一定是等到外部事务方法结束,整个线程结束才一起提交的。

在相同线程中进行相互嵌套调用的事务方法工作于相同的事务中。如果这些相互嵌套调用的方法工作在不同的线程中,则不同线程下的事务方法工作在独立的事务中。

而锁存在于事务里,锁的生命周期也是一个线程,在一个线程里可多次取得同一个锁。

如果事务加在外部方法A,在内部方法里面有synchronized代码块B,那么当B执行完时,事务还未提交,其他线程进入synchronized代码块B后,读取的库存数据不是最新的。

“Spring事务处理Transactional和并发线程的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯