首页 > 编程知识 正文

disrupt和interrupt,spring注解有哪些

时间:2023-05-05 23:38:34 阅读:106065 作者:2533

你知道得越多,不知道的就越多,业余的就像草一样! 来吧,一起精进吧! 别过来,我会和你的竞争对手一起精益求精!

编辑:业余草推荐:彻底掌握@transactional在https://www.xtt blog.com/p=5263 spring中的使用

事务管理是APP开发中不可缺少的一部分。 Spring为事务管理提供丰富的功能支持。

声明型事务有两种方法。 一种是在配置文件(xml )中声明相关事务规则,另一种是基于「@Transactional」注释。 注释的配置是现在常见的使用方法。

一. @Transactional评论管理事务的实现步骤@Transactional评论管理事务的实现步骤分为两个阶段。

首先,将事务配置信息添加到xml配置文件中。

tx : annotation-driven/bean id=' transaction manager ' class=' org.spring framework.JDBC.data source.datasource

@Transactional注释的属性信息

属性名称说明如果name配置文件中有多个事务管理器,则可以使用此属性指定选择哪个事务管理器。 传播事务的传播行为。 默认值为REQUIRED。 isolation事务的隔离度。 默认值为DEFAULT。 timeout事务的超时时间。 默认值为-1。 如果事务超过此限制时间后仍未完成,则会自动回滚事务。 只读指定事务是否为只读,默认值为false; 要忽略不需要事务的方法(如读取数据),请将只读设置为true。 rollback-for用于指定可以触发事务回滚的异常类型。 如果需要指定多种异常类型,可以用逗号分隔。 no-rollback-for抛出在no-rollback-for中指定的异常类型,但不回退事务。

也可以将@Transactional注释添加到类级别。 在类级别释放@Transactional注释意味着该类的所有公共方法构成同一个事务属性信息。

方法级事务属性信息复盖类级的相关配置信息。

@Transactional注释的标注位于类中:

@ transactional (propagation=propagation.supports, readOnly=true ) @ service (value=' employeeservice ' ) publicclassEmployeeService二、注释方式事务使用注意事项基于Spring的注释方式的实践

如果正确设置@Transactional的propagation属性,本来希望通过目标方法管理事务,但是如果错误地设置了这三个propagation,则不会回退事务。

transaction definition.propagation _ supports :如果当前存在事务,则参与该事务; 如果当前没有事务,请以事务以外的方式继续执行。

transaction definition.propagation _ not _ supported :以非事务方式执行,如果当前存在事务,则挂起当前事务。

transaction definition.propagation _ never :以非事务方式执行,如果当前存在事务,则抛出异常。

如果正确设置@Transactional的rollbackFor属性,则缺省情况下,如果事务抛出未检查的异常(从RuntimeException继承的异常)或Error,则为Spring 除此之外,Spring不会回滚事务!

如果希望事务中抛出其他类型的异常,并且Spring可以回滚事务,请指定rollbackFor。 例如:

@ transactional (propagation=propagation.required,rollbackFor=MyException.class )目标方法中抛出的异常在rollbackFor中指定

3. @Transactional仅适用于公共方法。 只有将@Transactional注释应用于公共方法,才能进行事务管理。

Spring AOP检查目标方法的修饰符是否是公共的,如果不是pu,则进行检查

blic,就不会获取 @Transactional 的属性配置信息,最终会造成不会用 TransactionInterceptor 来拦截该目标方法进行事务管理。

4. 避免 Spring 的 AOP 的自调用问题

在 Spring 的 AOP 代理下,只有目标方法由外部调用,目标方法才由 Spring 生成的代理对象来管理,这会造成自调用问题。

若同一类中的其他没有 @Transactional 注解的方法内部调用有 @Transactional 注解的方法,有 @Transactional 注解的方法的事务被忽略,不会发生回滚。

@Servicepublic class OrderService {    private void insert() {        insertOrder();    }    @Transactional    public void insertOrder() {        //insert log info        //insertOrder        //updateAccount    }}

insertOrder 尽管有@Transactional 注解,但它被内部方法 insert 调用,事务被忽略,出现异常事务不会发生回滚。

2. 三大问题

数据库事务的正确执行的 4 个基本要素是 原子性(「A」tommicity)、一致性(「C」onsistency)、隔离性(「I」solation) 和 持久性(「D」urability)。

原子性 : 整个事务中的操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节,仅完成一部分。

一致性 : 指一个事务可以改变数据库状态。食物必须始终保持系统处于一致状态,不管任何给定时间有多少并发事务。

隔离性 : 之两个事务之间的隔离级别。

持久性 : 在事务完成以后,该事务对数据库所做的更改便持久保存在数据库中,并不会被回滚。

三大问题从 严重 到 轻度 以此如下:

「脏读问题」

时刻事务一(老公)事务二(老婆)T1查询余额,显示10k——T2——查询余额,显示 10kT3——网购 1千,显示 9kT4请客吃饭开销 1k,显示余额 8k——T5提交事务——T6——回滚事务T7——最终余额 8k

所谓脏读,指的就是读到了“脏”数据,即一个事务读取到了另一个事务未提交的数据。

「不可重复读问题」

时刻事务一(老公)事务二(老婆)T1查询余额,显示10k——T2——查询余额,显示 10kT3——网购,开销 1k,余额 9kT4请客吃饭,预计开销 2k——T5——网购,开销 8k,余额 1kT6——提交事务T7吃完买单,显示余额1k,不够付账。——

不可重复读,指的是理论上的同一条数据,重复读取,居然会不一样,不具备可重复性。

「幻读问题」

时刻事务一(老公)事务二(老婆)T1——查询信用卡消费记录,显示 10 条记录T2网购——T3提交事务——T4——打印消费记录,有11条记录

幻读,和不可重复读类似,第二次读取的数据相较于第一次居然发生了变化,仿佛看到了幻觉。

不可重复读 和 幻读 有一定的相似性,都是指(在本人未改变的情况下)第二次读取的数据,与第一次读取结果不一样。不过它们描述的侧重点(及造成的影响程度)不一样。

不可重复读问题,强调的是某一条数据的内容在“我”两次读取间,发生了改变。(因为 update 语句)

幻读问题,强调的整个数据的数据总量,在“我”两次读取间,发生了改变。(因为 insert / delete 语句)

幻读问题 造成的危害要小于 不可重复读问题。

3. 四个隔离级别

隔离级别表示:「当“我”操作这张表时,“其他人”对这张表还有多大的操作权限」 。“我”的隔离级别越高,其他人的权利就越小,那么“他”要执行他想要执行的操作而没有权限时,那就只能 「等」“我”操作完 。

数据库领域有四个隔离级别(注意,这并非 Java 中特有的概念),针对于上述三大问题,四个隔离级别,从 解决不了任何问题 到 解决所有问题,每一级多解决一个问题。

隔离级别解决问题备注READ_UNCOMMITTED解决不了任何问题——READ_COMMITTED可以解决脏读问题——REPEATABLE_READ可以解决不可重复读问题包括解决脏读问题SERIALIZABLE解决幻读问题包括解决不可重复读和脏读问题

4. 传播机制

传播行为含义备注REQUIRED当方法调用时,如果不存在当前事务,那么就创建事务;如果之前已经存在了事物,那么就沿用之前的事务。默认值SUPPORTS当方法调用时,如果不存在当前事务,就不启用事务;如果当前启用事务,那么就沿用当前事务。——MANATORY方法必须在事务内运行。如果不存在当前事务,则直接抛出异常。REQUIRES_NEW无论是否存在当前事务,方法都会在新的事务中运行总是开启一个新事务,执行本方法。NOT_SUPPORTED不支持事务,不存在当前事务也不会创建新事务;如果存在当前事务则挂起它,直到方法结束后才恢复当前事务适用于那些不支持事务的数据库和SQL语句NEVER不支持事务。MANATORY 的“反面”,如果存在当前事务,就直接抛出异常。NESTED嵌套事务。REQUIRES_NEW 的高级版支持当前事务中使用保存点(savepoint),可以回滚到保存点;如果当前事务没有保存点,则完全等价于 REQUIRES_NEW

毫无疑问,最常用的是 REQUIRED,其次是 REQUIRES_NEW 。它们是最常见的业务处理方式,其它方式都是用于处理特定的业务。

传播机制本质上描述的是:在一个整体行为中,一个部分行为的失败,会不会对整体行为造成影响,以及造成何种影响。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。