iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring事务处理Transactional,锁同步和并发线程
  • 136
分享到

Spring事务处理Transactional,锁同步和并发线程

2024-04-02 19:04:59 136人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

spring事务传播机制和数据库隔离级别 在标准sql规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。 未授权读取(Read Uncommitted): 也称

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

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

  • 未授权读取(Read Uncommitted): 也称 未提交读。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过 “排他写”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。
  • 授权读取(Read Committed): 也称提交 读。允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将 会禁止其他事务访问该行。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。
  • 可重复读取(Repeatable Read): 禁止 不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁 止任何其他事务。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。
  • 串行(Serializable): 也称可串行读。提 供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机 制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠 事务均是串行的。
隔离级别 更新丢失 脏读取 重复读取 幻读
未授权读取 N Y Y Y
授权读取 N N Y Y
可重复读取 N N N Y
串行 N N N N

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后,读取的库存数据不是最新的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Spring事务处理Transactional,锁同步和并发线程

本文链接: https://www.lsjlt.com/news/161247.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring事务处理Transactional,锁同步和并发线程
    Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。 未授权读取(Read Uncommitted): 也称 ...
    99+
    2024-04-02
  • Spring事务处理Transactional和并发线程的方法是什么
    本篇内容介绍了“Spring事务处理Transactional和并发线程的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Sprin...
    99+
    2023-06-22
  • C#开发中如何处理并发编程和线程同步问题
    C#开发中如何处理并发编程和线程同步问题,需要具体代码示例在C#开发中,处理并发编程和线程同步问题是非常重要的。并发编程是指在程序中同时执行多个任务或操作,而线程同步则是指多个线程在访问共享资源时的协调和同步。为了解决并发编程和线程同步问题...
    99+
    2023-10-22
    线程同步 处理问题 C#关键词: 并发编程
  • C#开发中如何处理线程同步和并发访问问题
    C#开发中如何处理线程同步和并发访问问题,需要具体代码示例在C#开发中,线程同步和并发访问问题是一个常见的挑战。由于多个线程可以同时访问和操作共享数据,可能会出现竞态条件和数据不一致的问题。为了解决这些问题,我们可以使用各种同步机制和并发控...
    99+
    2023-10-22
    线程同步 并发访问 C#开发
  • Java多线程事务回滚@Transactional失效处理方案
    目录背景介绍公用的类和方法示例事务不成功操作使用sqlSession控制手动提交事务 背景介绍 1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插...
    99+
    2022-11-13
    Java多线程事务回滚 Java @Transactional失效
  • python3--线程,锁,同步锁,递归锁,信号量,事件,条件和定时器,队列,线程池
    线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位进程和线程是什么关系?  线程是在进程中的 一个执行单位  多进程 本质上开启的这个进程里就有一个线程  多线程 单纯的在当前进程中开启了多个线...
    99+
    2023-01-30
    递归 线程 信号量
  • C#并发编程和线程同步机制是什么
    C#并发编程是指在C#程序中同时执行多个任务的能力。线程同步机制是确保多个线程能够安全地访问共享资源的方法。在C#中,线程同步可以通...
    99+
    2024-03-07
    C#
  • 异步 Python 编程:解锁多线程和并发的奥秘
    在现代软件开发中,异步编程已成为提高应用程序性能和响应能力的关键。Python 作为一种多功能语言,通过其并行和异步编程特性提供了强大的异步解决方案。本文将深入探讨异步 Python 编程,揭开多线程和并发的奥秘。 多线程的理解 多线程是...
    99+
    2024-03-09
    引言
  • C#开发中如何处理并发编程和多线程同步问题及解决方法
    C#开发中如何处理并发编程和多线程同步问题及解决方法在如今的软件开发领域中,并发编程已经成为一种常见的需求。在许多应用程序中,我们需要同时处理多个任务,而多线程是实现这个目标的一种常见方式。然而,处理并发编程和多线程同步问题并不容易。本文将...
    99+
    2023-10-22
    并发编程 解决方法 多线程同步
  • 并发编程,你是如何处理多线程间的同步和互斥问题的?
    随着计算机技术的不断发展,多核处理器的出现使得多线程编程变得越来越普遍。然而,多线程编程带来的同步和互斥问题也随之而来。在本文中,我们将探讨如何在并发编程中处理多线程间的同步和互斥问题。 同步问题 在多线程编程中,同步问题是指多个线程在...
    99+
    2023-07-23
    bash leetcode 并发
  • Golang开发注意事项:如何处理并发同步问题
    在现代计算机编程中,对于处理大量数据或高并发场景,Golang是一个非常流行的编程语言。它强大的并发机制使得同时处理多个任务变得轻松,但同时也需要我们注意并发同步的问题。在本文中,我们将探讨Golang开发中可能遇到的并发同步问题,并提供一...
    99+
    2023-11-23
    Golang 并发 同步
  • C#开发中如何处理线程同步和并发访问问题及解决方法
    C#开发中如何处理线程同步和并发访问问题及解决方法随着计算机系统和处理器的发展,多核处理器的普及使得并行计算和多线程编程变得非常重要。在C#开发中,线程同步和并发访问问题是我们经常面临的挑战。没有正确处理这些问题,可能会导致数据竞争(Dat...
    99+
    2023-10-22
    解决方法 线程同步 并发访问
  • Java线程的锁对象Lock同步问的处理方式
    本篇内容介绍了“Java线程的锁对象Lock同步问的处理方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lock是java.util.co...
    99+
    2023-05-30
    java
  • 掌握 Java 线程池,解锁并发处理的潜力
    在当今复杂的分布式系统中,并发处理对于高效执行任务至关重要。Java 线程池是一种强大的工具,它通过管理和调度线程,帮助开发人员充分利用并发性,从而提高性能和可伸缩性。 线程池概述 线程池是一个线程的集合,这些线程可以根据需要按需创建和销...
    99+
    2024-03-13
    线程池
  • ASP编程:如何使用算法处理同步和并发问题?
    在ASP编程中,处理同步和并发问题是非常重要的。在多个用户同时访问同一个页面或资源时,我们需要确保程序能够正确地处理这些并发请求,以避免出现数据不一致、死锁等问题。在本文中,我们将介绍如何使用算法来处理同步和并发问题,并提供一些示例代码来...
    99+
    2023-07-07
    同步 并发 编程算法
  • PHP开发中的多线程编程和并发处理
    php的多线程编程和并发处理提供了以下技术:创建线程(pthread_create())并等待其完成(pthread_join())。通过互斥锁(pthread_mutex_lock()...
    99+
    2024-05-09
    php 并发处理 并发请求
  • C#开发中如何处理多线程同步和互斥问题
    C#开发中如何处理多线程同步和互斥问题,需要具体代码示例概述:在C#中,多线程的使用成为了常见的开发需求。然而,由于多线程同时操作共享资源可能导致数据不一致或者冲突的问题,因此需要使用同步和互斥机制来解决这些问题。本文将介绍在C#开发中如何...
    99+
    2023-10-22
    多线程 同步 互斥
  • C#开发中如何处理多线程同步和互斥访问
    C#开发中如何处理多线程同步和互斥访问,需要具体代码示例在C#开发中,多线程的使用可以提高程序的并发性和性能。然而,多线程的并发执行也可能导致一些问题,如数据竞争和资源冲突等。为了解决这些问题,我们需要使用同步和互斥机制来确保线程之间的正确...
    99+
    2023-10-22
    多线程 同步 互斥 访问 C#开发
  • PHP开发中如何处理分布式锁和同步机制
    引言:在PHP开发中,我们经常会遇到需要处理分布式锁和同步机制的问题。特别是在多台服务器上同时运行的情况下,为了避免数据竞争和冲突,我们需要采取一些措施来确保代码的安全性和一致性。本文将介绍在PHP开发中如何处理分布式锁和同步机制的方法,并...
    99+
    2023-10-21
    分布式锁 PHP开发 同步机制
  • 同步还是异步?Java和Django并发处理的最佳实践
    随着互联网的发展,高并发成为了许多应用程序的必备特性。在这样的情况下,如何有效地处理并发请求成为了一个需要被解决的问题。Java和Django作为两种常用的编程语言,都有着自己的并发处理方式。那么,这两种语言的并发处理方式有什么区别呢?本...
    99+
    2023-09-10
    django 同步 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作