主要是从执行效率的角度考虑(谈谈你对工作效率和执行力的理解)(执行力与效率的关系)

大家好,我们又见面了。

在大多数数据库操作项目中,事务控制和事务处理是无法避免的问题。例如,如果必须控制和处理SQL执行进程的事务,则其总体处理流程如下:。

 主要是从执行效率的角度考虑(谈谈你对工作效率和执行力的理解)(执行力与效率的关系) 热门话题

首先打开事务,然后运行特定SQL,如果执行异常,则回滚事务,否则提交事务,最后关闭事务,完成整个过程。按照此流程的逻辑编写相应的实现代码。

您可以看到,上面的大段代码逻辑并不复杂,只是对业务执行了insert操作。然而,杂乱的事务控制代码明显干扰了业务本身对代码处理逻辑的读取和理解。

通常的项目代码中,涉及DB处理的场景很多,如果每个地方都有这样的事务控制逻辑,那么整体代码的可维护性就会变差,想想都觉得喘不过气来。

幸运的是,JAVA有很多项目都是基于Spring框架构建的。得益于框架的封装,在业务代码中进行事务控制操作也很简单,直接标注即可,大大简化了对业务代码的侵入性。那么,你对事务注释有充分的了解吗。你知道注释可能无法按预期工作的场景吗。您知道如何使用它来最小化对性能的影响吗。

接下来,让我们一起探讨这些问题。

Spring数据库的事务约定处理逻辑流程如下图所示,比较前面例子中基于的事务,Spring的事务的处理操作交给Spring框架处理,开发人员只需实现自己的业务逻辑即可大幅简化了交易方的处理投入。

 主要是从执行效率的角度考虑(谈谈你对工作效率和执行力的理解)(执行力与效率的关系) 热门话题

基于Spring事务机制,上述实现DB操作事务控制的代码,我们的代码将非常简洁:

与JDBC事务实现代码相比,基于Spring的方式只需添加一个注释即可,代码中只需实现业务逻辑即可,实现了事务控制机制对业务代码的低侵入性。

指定当前事务处理是否为只读事务处理的参数。如果设置为真,则此事务是只读事务,默认情况下为假。

本文介绍了只读事务的概念。其含义如下:。

包含在多个查询语句一起执行的场景中的概念。表示从事务设置的瞬间到整个事务执行结束期间,其他事务提交的写入操作数据不会显示给事务。

例如:

已启动包含两个SQL查询操作的复合查询操作。在获取用户表中的所有数据之前,获取用户表的计数。

先执行取得用户表的计数数而得到结果10

如果未开始执行以下语句,则另一个进程将操作数据库并在用户表中插入新数据

执行复合操作的第2条SQL语句、取得用户列表的操作,返回11条记录

显然,复合操作的两个SQL语句获取的数据结果不匹配。原因是非原子操作,也就是说,在执行两个查询操作的时间间隔内,另一个写入操作更改了目标读取的数据,因此出现了此问题。

 主要是从执行效率的角度考虑(谈谈你对工作效率和执行力的理解)(执行力与效率的关系) 热门话题

为了避免这种情况,可以将只读事务添加到复合查询操作中。这样,在事务控制范围内不会显示事务外的写入操作,从而确保事务内多个查询语句执行结果的一致性。

那么,为什么要设置为只读事务而不是普通事务。主要是从执行效率的角度考虑。由于此操作都是只读操作,因此如果将其设置为只读事务处理,数据库将为只读事务处理提供优化手段,例如不启动回退段、不记录回退日志。

有四个不同的属性支持不同的参数输入,您可以设置回滚条件。

含义说明

用于指定需要回滚的特定例外类型,可以指定一个或多个。在抛出指定的异常类型之前,方法执行逻辑不会触发事务回滚。

同样,设置字符串格式的类名

指定不需要回滚的例外类型。如果抛出方法中指定类型的异常,则不执行事务回滚。其余类型的异常将触发事务回滚。

同样,设置字符串格式的类名

同样,和的使用与上面的映像相似,但其意思是功能点相反。

指定此事务处理的传播类型。事务传播类型是指在当前已处于事务上下文中的情况下,必须启动执行用于处理要打开的新事务的进程策略的事务。

主要有7种类型的事务传播类型。

传播类型

含义说明

如果当前存在事务,请加入该事务。如果当前没有事务,请创建新事务

如果当前存在事务,请加入该事务。如果当前没有事务,请使用事务以外的方法继续执行。

如果当前存在事务,请加入该事务。抛出异常如果当前没有事务

创建一个新事务,如果事务当前存在,则保留当前事务

在非事务中运行,如果当前事务存在,则挂起当前事务

NEVER

在非事务中运行,如果当前事务存在,则抛出异常

NESTED

事务传播行为影响事务控制的结果。例如,在同一事务中,如果发生异常,则会回滚所有操作,但对于多个事务,不会影响提交的其余事务的回滚。

属性可用于设置事务超时秒数。缺省值为-1,表示不超时。

Spring的事务实现原理是AOP,AOP的原理是动态代理。

 主要是从执行效率的角度考虑(谈谈你对工作效率和执行力的理解)(执行力与效率的关系) 热门话题

在类内部方法之间相互调用时,本质上不是使用代理对象调用,而是类对象本身的调用,也不会触发AOP。因此,此处的事务控制不起作用,因为Spring无法将事务控制的代码逻辑并入调用代码流。

因此,如果在同一类中的多个方法之间相互调用,并且调用的方法需要进行事务控制,则需要特别注意这个问题。作为解决方案,可以创建两个不同的类,并将方法放置在两个类中。这将在类之间调用,并启用Spring事务机制。

这与业务代码认为捕获的异常不需要触发回滚一样,很容易理解业务代码将所有异常都吞噬在catch中。在框架中,捕获异常并且成功执行业务逻辑,因此也不会触发异常回退机制。

事务处理对性能有一定的影响,因此事务处理并不是在任何地方都可以轻松添加。一些对性能敏感的场景需要注意以下几点:。

仅在需要时添加事务控制

数据库操作无关,无需添加事务控制

不需要添加事务控制的单个查询语句

仅查询操作的多个SQL执行场景。可以添加只读事务控制。

单个语句实际上不需要添加事务。单个语句的执行在数据库中具有隐式事务控制机制,如果执行失败则为错误,不更新数据,不需要回滚。

尽量减小事务控制的代码段处理范围

主要从性能方面考虑,与事务机制、同步场景锁定过程相似,范围越大,对性能的影响就越明显

事务控制范围内的业务逻辑尽可能简单,以避免与非事务相关的耗时处理逻辑

从性能方面考虑,在事务控制之外尽可能地执行耗时的逻辑,在事务内仅保持与DB操作确实相关的逻辑

我是悟性,谈技术,不只是谈技术~

和你一起探讨,期待成长为更好的自己。

 主要是从执行效率的角度考虑(谈谈你对工作效率和执行力的理解)(执行力与效率的关系) 热门话题


先执行取得用户表的计数数而得到结果10

[新闻自媒体]

发表评论

Copyright 2002-2022 by 埃侩跨境电商网(琼ICP备2022001899号-3).All Rights Reserved.