事务并发传播性隔离级别(代码片段)

一只猪的思考 一只猪的思考     2022-12-31     265

关键词:

事务并发、传播性、隔离级别(重难点)

导读:本节重点在于多线程并发环境下的事务处理、和数据库在并发环境下的表锁和行锁。

案例:在新增图书的时候,肯定需要先新增作者。

SpringMVC声明式事务

事务分两种:编程式事务、声明式事务

Connection conn

conn.setAutoCommit(false)

conn.commit() conn.rollback()

导包

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.1.6.RELEASE</version>
    </dependency>

配置

<!--配置声明式事务-->
    <!--采用数据源事务-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--允许事务以注解的方式进行配置-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

使用

@Transactional//此注解表示,此方法的事务交给Spring管理
    public void save(TbBook book)
        //新增作者新增,并且需要返回主键
        int authorId = authorService.save(book.getAuthor());
        if (1==1)
            throw new NullPointerException("故意的");
        

        book.setAuthorId(authorId);
        //完成新增图书的操作
        bookMapper.save(book);

    

一、事务的传播

导读:我们知道,mvc模型中一般将事务放在service层控制,那么问题是:service层方法A调用service层方法B,方法A和方法B是否在同一个事务中? 
案例1:方法A和方法B上都有事务注解,方法A调用方法B,此时方法B中出现异常,是否会导致方法A回滚?
答案:会回滚

分析:方法A和方法B在同一个事务中,证明方法A的事务会传递给方法B,这就是Spring声明式事务的传播性。

案例2:方法A调用方法B,方法B出现异常,不要影响到方法A的成功事务执行。

1.1、Spring中的事务传播性(声明式事务)

涉及到事务的作用域。 session和事务间的关系。事务的传播行为有如下几种:

1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个。(默认)
    比如:方法A调用方法B,方法A有事务,方法B会延用方法A的事务,而不会重新创建。如果方法A没有事务,方法B有事务,方法B会新建事务。
2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,不新建事务。
    比如:方法A调用方法B,方法A有事务,方法B会延用方法A的事务,而不会重新创建。如果方法A不支持事务,方法B有事务,方法B不会新建事务。
3)PROPAGATION_MANDATORY:支持当前事务,没有事务会抛异常
    比如:方法A调用方法B,方法A有事务,则方法B也有事务。如果方法A没有事务,方法B需要事务就会抛出异常。
4)PROPAGATION_REQUIRES_NEW:使用新建事务,如果当前存在事务,把当前事务挂起
    比如:方法A调用方法B,不管方法A是否支持事务,方法B都会新建事务(挂起方法A的事务)。
5)PROPAGATION_NOT_SUPPORTED:不支持事务操作,有事务则挂起
    比如:方法A调用方法B,不论方法A是否有事务,方法B都不支持事务。
6)PROPAGATION_NEVER:不支持事务,有事务则挂起 
    比如:方法A调用方法B,不论方法A是否有事务,方法B都不支持事务。
7)PROPAGATTION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作
    同 PROPAGATION_REQUIRED 操作

注意:

内层事务的异常可能会影响到外层事务。即使内层开启的新事务。原因:内层方法出现异常,会导致被挂起的异常无法正常执行完成。

事务传播:

1、默认情况下,spring方法中事务的传播特性为:如果方法的上一级方法存在事务,则方法会沿用上一级方法的事务。

PROPAGATION_REQUIRES_NEW 开启新的session

二、事务隔离级别

导读:事务的四大特性中的隔离性的实现会带来一定的性能消耗~ 要实现事务的隔离性,就需要避免线程同步操作同一条数据。事务的隔离级别问题分类如下:
1、脏读(事务a读取了事务b没有提交的数据)
2、不可重复读(事务a读取了数据后,事务b对此数据进行了修改,事务a再次读取发现不一致)
3、幻读(事务a读取一个范围的数据后,事务b又修改了一条数据进来,导致事务a再次读取时发现不一样,多出一行数据,好像出现幻觉一样)。

隔离级别是事务四大特性之一的隔离性的级别。隔离也分不同级别的隔离:

读未提交(read uncommitted):没有隔离

读已提交(read committed)

可重复度(repeatable read):默认

串行化(serializable)

事务隔离级别的实现方式是加锁,隔离级别越高,锁影响的范围越大。效率越低。

2.1、脏读(最低隔离级别)

修改数据库的事务隔离级别:

set session transaction isolation level read uncommitted; //session表示当前会话(请求),transaction就表示事务,isolation表示隔离,level表示级别

事务隔离级别的分类:

read uncommitted、read committed、repeatable read(默认)、serializable(串行)

####脏读演示

解决脏读:配置事务隔离级别为read committed。

脏读现象:一个事务读取了另一个事务没有提交的内容~~

1、开启两个客户端,都开启事务

2、一个客户端用来读数据,一个客户端用来写数据(但是不提交事务,之后做事务回滚)。

3、写操作进行事务回滚

####避免脏读

数据库默认是避免脏读的~

select @@tx_isolation;##设置数据的事务的隔离级别##read uncommitted能读取其他事务没有提交的内容,最低的隔离级别set session transaction isolation level repeatable read;start transaction;select * from tb_account where account_id=1 for update;update tb_account set account_money=200 where account_id=1;commit;insert into tb_account(account_money,account_user_id) values(100,2);rollback;select @@tx_isolation;select * from tb_account;start transaction;

2.2、锁

数据库引擎常见分2种:myisam和innodb。

数据库引擎:是一种数据操作的机制。

目前数据库默认存储引擎:InnoDB。

区别:

InnoDB:支持事务、行锁 MySql8.0

MyIsam:不支持事务、表锁

InnoDB

行锁(共享锁(读锁)和排它锁(写锁)):

SELECT ... LOCK IN SHARE MODE  //共享锁、乐观锁、读锁特点:对读操作共享,写操作排队
SELECT ... FOR UPDATE; //排他锁

MyIsam

lock table tb_user readunlock tables;

长文捋明白spring事务!隔离性?传播性?一网打尽!(代码片段)

文章目录1.什么是事务2.Spring中的事务2.1两种用法2.2三大基础设施2.2.1PlatformTransactionManager2.2.2TransactionDefinition2.2.3TransactionStatus3.编程式事务4.声明式事务4.1XML配置4.2Java配置4.3混合配置5.事务属性5.1隔离性5.1.1编程式事务隔离级别5.1.... 查看详情

mysql事务隔离级别(代码片段)

MySQL的事务必须满足A(原子性)C(一致性)I(隔离性)D(持久性)原则。其中,隔离性是为了尽量减少并发事务彼此之间的影响,最高的隔离级别可以保证并发事务之间互不影响。  在... 查看详情

事务的隔离级别和传播行为

一、什么是事务隔离  一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 五个事务隔级别:lsolation的属性值1,default默认的事... 查看详情

mysql高级篇——事务的隔离级别与简单应用(代码片段)

...发所存在的问题1.1脏写1.2脏读1.3不可重复读1.4幻读2.SQL中事务的隔离级别3.案例实操3.1查看与修改MySQL的隔离级别3.2读未提交-举例3.3 读已提交-举例3.4 可重复读-举例3.5 幻读-举例1.数据并发所存在的问题针对事务的隔离性和并发... 查看详情

5分钟带你读懂事务隔离性与隔离级别(代码片段)

前言我们在上一章节中介绍过数据库的带你了解数据库中事务的ACID特性的相关用法。本章节主要来介绍下数据库中一个非常重要的知识点事务的隔离级别。如有错误还请大家及时指出~问题:事务的隔离级别有哪些?如果并发事... 查看详情

spring事务的5种隔离级别和7种传播性

隔离级别isolation,5种:ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_REPEATABLE_READ,ISOLATION_SERIALIZABLE,隔离级别解决的问题:脏读,幻读,不可重复读,传播性 propagation,7种:PROPAGATION_REQUIR 查看详情

事务的四大特性,传播行为以及应用场景(代码片段)

一、事务的四大特性:*ACID:原子性,一致性,隔离性,持久性*原子性:要不一起成功,要不一起回滚;*一致性:对数据的操作,数据总数不变;(转账业务A转账B20元,但是AB的总计还是原来的数值)*隔离性:一个事务不会影响另一... 查看详情

长文捋明白spring事务!隔离性?传播性?一网打尽!(代码片段)

文章目录1.什么是事务2.Spring中的事务2.1两种用法2.2三大基础设施2.2.1PlatformTransactionManager2.2.2TransactionDefinition2.2.3TransactionStatus3.编程式事务4.声明式事务4.1XML配置4.2Java配置4.3混合配置5.事务属性5.1隔离性5.1.1编程式事务隔离级别5.1.... 查看详情

什么是事务事务特性事务隔离级别spring事务传播特性

1.什么是事务:事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。2.事务特性:事务特性分为四个:原子性(Atomicity)、一致... 查看详情

spring事物的传播性和隔离级别

七个事传播属性:PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行行。PROPAGATION_MANDATORY–... 查看详情

springboot-事务隔离教程(代码片段)

在上一个教程-SpringBoot事务管理示例中,我们了解了什么是事务并实现了声明式事务管理。同样在上一教程中,我们实现了各种事务传播类型。在本教程中,我们将了解什么是事务隔离及其不同类型。视频讲解地址... 查看详情

事务隔离级别(代码片段)

事务隔离级别:了解数据库事务的最重要因素事务是数据库管理系统(DBMS)中一个重要的概念,它能够确保数据库操作的完整性和一致性。然而,如果多个事务同时运行并试图访问同一个数据,即想同时保证并发性和一致性,... 查看详情

mysql事务readcommitted隔离级别的数据可见性(代码片段)

模拟MySQL事务ReadCommited已提交读隔离级别数据的可见性。预先创建一张表test,表中只有一个字段state。createtabletest(stateintnotnull)engine=InnoDBcharset=utf8mb4;在两个终端中分别开启两个事务:事务的隔离级别是ReadCommitted结论:在ReadCommitt... 查看详情

事务与mysql隔离级别(代码片段)

事务定义:比如ABCD四个业务,作为一个事务,他们要么一起都执行完毕,要么都不执行。(只要有一个不成功,那么所有的都不可以成功)四个特性ACID原子性(Atomicity)整个事务中的所有操作,要么全都完成,要么全部不完成。事务... 查看详情

事务的隔离级别和传播行为

一、事务的隔离级别1.五种事务的隔离级别  ①读_未提交(read_uncommitted):会出现脏读、不可重复读、幻读。(隔离级别最低,并发性能高)  ②读_已提交(read_committed):会出现不可重复读、幻读。(锁定正在读取的行) ... 查看详情

事务并发之隔离级别

事务事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性(ACID)属性,只有这样才能成为一个事务。事务并发数据库是多个用户(事务)共享的,当多个用户同... 查看详情

spring声明式事务@transactional详解,事务隔离级别和传播行为(代码片段)

...:readOnly、propagation、isolation。其中propagation属性用来枚举事务的传播行为,isolation用来设置事务隔离级别,readOnly进行读写事务控制。@Service@Transactional(readOnly=true)publicclassAppTradeRec2ServiceextendsBaseService@AutowiredprivateAppTradeRecDaoappTrade... 查看详情

事务的传播性和隔离级别

事务的传播性:1、PROPOGATION_REQUIRES      --需要在一个事务中执行2、PROPOGATION_SUPPOTS       --不需要在一个事务中执行,如果有事务,也可以执行3  PROPOGATION_NOT_SUPPORTED--不支持... 查看详情