java之事务

    xiaoxiao2021-04-15  27

    一.什么是事务

     事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。

    事务的结束有两种当事务中的所以步骤全部成功执行时,事务提交如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。

    二.四个特性

    1 、原子性

    事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

    2 、一致性

    务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

    3 、隔离性

    一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

    4 、持续性

    也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

     

    三.数据库事务的隔离级别

    √: 可能出现    ×: 不会出现

     

    脏读

    不可重复读

    幻读

    Read uncommitted(读未提交)

    Read committed(读已提交)

    ×

    Repeatable read(重复读)

    ×

    ×

    Serializable(序列化)

    ×

    ×

    ×

     

    四.事务的分类

    显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型

    隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务

    自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚

     

    五.怎么创建数据库的一个事务

    1 开始事务: begin transaction

    2 提交事务:commit transaction

    3 回滚事务: rollback transaction

    事务通常是以BEGIN TRANSACTION开始,以COMMITROLLBACK结束。

    COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。

    ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态

     

    六.mysql中,以下哪种方式可以开启一个事务?

    START TRANSACTION

    BEGIN

     

    七.事务的7种传播级别

    事务的7种传播级别:

     

    1 PROPAGATION_REQUIRED ,默认的spring事务传播级别,使用该级别的特点是,如果上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行。所以这个级别通常能满足处理大多数的业务场景。

     

    2PROPAGATION_SUPPORTS ,从字面意思就知道,supports,支持,该传播级别的特点是,如果上下文存在事务,则支持事务加入事务,如果没有事务,则使用非事务的方式执行。所以说,并非所有的包在transactionTemplate.execute中的代码都会有事务支持。这个通常是用来处理那些并非原子性的非核心业务逻辑操作。应用场景较少。

     

    3PROPAGATION_MANDATORY 该级别的事务要求上下文中必须要存在事务,否则就会抛出异常!配置该方式的传播级别是有效的控制上下文调用代码遗漏添加事务控制的保证手段。比如一段代码不能单独被调用执行,但是一旦被调用,就必须有事务包含的情况,就可以使用这个传播级别。

     

    4PROPAGATION_REQUIRES_NEW ,从字面即可知道,new,每次都要一个新事务,该传播级别的特点是,每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。

     

    这是一个很有用的传播级别,举一个应用场景:现在有一个发送100个红包的操作,在发送之前,要做一些系统的初始化、验证、数据记录操作,然后发送100封红包,然后再记录发送日志,发送日志要求100%的准确,如果日志不准确,那么整个父事务逻辑需要回滚。

    怎么处理整个业务需求呢?就是通过这个PROPAGATION_REQUIRES_NEW 级别的事务传播控制就可以完成。发送红包的子事务不会直接影响到父事务的提交和回滚。

     

    5PROPAGATION_NOT_SUPPORTED ,这个也可以从字面得知,not supported ,不支持,当前级别的特点就是上下文中存在事务,则挂起事务,执行当前逻辑,结束后恢复上下文的事务。

     

    这个级别有什么好处?可以帮助你将事务极可能的缩小。我们知道一个事务越大,它存在的风险也就越多。所以在处理事务的过程中,要保证尽可能的缩小范围。比如一段代码,是每次逻辑操作都必须调用的,比如循环1000次的某个非核心业务逻辑操作。这样的代码如果包在事务中,势必造成事务太大,导致出现一些难以考虑周全的异常情况。所以这个事务这个级别的传播级别就派上用场了。用当前级别的事务模板抱起来就可以了。

     

    6PROPAGATION_NEVER ,该事务更严格,上面一个事务传播级别只是不支持而已,有事务就挂起,而PROPAGATION_NEVER传播级别要求上下文中不能存在事务,一旦有事务,就抛出runtime异常,强制停止执行!这个级别上辈子跟事务有仇。

     

    7PROPAGATION_NESTED ,字面也可知道,nested,嵌套级别事务。该传播级别特征是,如果上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。

     

    八.Spring配置声明式事务

    * 配置DataSource * 配置事务管理器 * 事务的传播特性 * 那些类那些方法使用事务

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSourceTransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分

        DataSourceTransactionManager这两部分只是会根据数据访问方式有所变化

    比如使用hibernate进行数据访问 时,DataSource实际为SessionFactoryTransactionManager的实现为 HibernateTransactionManager

    九.根据代理机制的不同,Spring事务的配置又有几种不同的方式

    第一种方式:每个Bean都有一个代理

    第二种方式:所有Bean共享一个代理基类

    第三种方式:使用拦截器

    第四种方式:使用tx标签配置的拦截器

    第五种方式:全注解

    十.spring是如何控制事务的?

    spring的事务是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序。最大的好处是大大减少了代码量

     

    十一.spring事务控制放在service层,在service方法中一个方法调用service中的另一个方法,默认开启几个事务?

    一个。

    spring的事务传播方式默认是PROPAGATION_REQUIRED,也就是加入当前事务(如果没有就开启一个新事务)。

    十二.spring是怎么配置事物的

    Spring提供的事务管理可以分为两类:编程式的和声明式的。

    编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活方便。

     

    1.编程式的事务管理流程可能如下:

      (1) 声明数据源。

      (2) 声明一个事务管理类,

      (3) 在我们的代码中加入事务处理代码

    2.Spring声明式事务处理 

    1)定义数据源,事务管理类

    2)定义事务拦截器

    3)为组件声明一个代理类

    十三.怎么让spring的事务调用另外一个事务

    Spring的事务机制是透明的,不需要去调用。如果真的要手动调用的话,可以使用TransactionTemplate提供的方法

     

     

    转载请注明原文地址: https://ju.6miu.com/read-671425.html

    最新回复(0)