全教育培训行业第三方平台平台就业机构
扫码试听
扫码试听
Q:2638333071
首页 > 行业问答 > > .spring的事务有几种方式spring事务的隔离级别和传播行为是什么?(spring的事务隔离与传播)
行业动态 行业问答 课程问答 零基础学习 就业前景 技术干货

.spring的事务有几种方式spring事务的隔离级别和传播行为是什么?(spring的事务隔离与传播)

发布时间:1 天 前 栏目:行业问答 浏览:

1、.spring的事务有几种方式spring事务的隔离级别和传播行为是什么?

Spring提供了许多内置事务管理器实现,常用的有:

DataSourceTransactionManager(JDBC局部事务);

JtaTransactionManager(JTA全局事务);

HibernateTransactionManager(Hibernate事务)。

一、事务的隔离级别:

数据库系统提供了4种事务隔离级别,在这4种隔离级别中,Serializable的隔离级别最高,Read Uncommitted的隔离级别最低;

Read Uncommitted:读未提交数据;(会出现脏读)

Read Committed:读已提交数据;

Repeatable Read:可重复读;

Serializable:串行化。

二、事务的传播属性包括:

Required:业务方法需要在一个事务中运行,如果一个方法运行时已经处在一个事务中,那么加入到该事务,否则为自己创建一个新事务,80%的方法用到该传播属性:

Not-Supported

Requiresnew

Mandatoky

Supports

Never

Nested

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。

.spring的事务有几种方式spring事务的隔离级别和传播行为是什么?

2、Spring事务失效的常见场景学生来看

JavaSpring 八种常见失效场景

1.事务方法未被Spring管理

如果事务方法所在的类没有注册到Spring IOC容器中,也就是说,事务方法所在类并没有被Spring管理,则Spring事务会失效

2.方法使用final类型修饰

有时候,某个方法不想被子类重新,这时可以将该方法定义成final的。普通方法这样定义是没问题的,但如果将事务方法定义成final,例如:

3.非public修饰的方法

如果事务方式不是public修饰,此时Spring事务会失效,举个例子

4.同一个类中的方法相互调用

5,方法的事务传播类型不支持事务

如果内部方法的事务传播类型为不支持事务的传播类型,则内部方法的事务同样会在Spring中失效,举个例子

6.未配置开启事务

如果项目中没有配置Spring的事务管理器,即使使用了Spring的事务管理功能,Spring的事务也不会生效,例如,如果你是Spring Boot项目,没有在SpringBoot项目中配置如下代码

7.错误的传播特性

其实,我们在使用@Transactional注解时,是可以指定propagation参数的。该参数的作用是指定事务的传播特性,目前Spring支持4种传播特性:

REQUIRED如果当前上下文中存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。

SUPPORTS如果当前上下;文存在事务,则支持事务加入事务,如果不存在事务,则使用非事务的方式执行。

MANDATORY如果当前上下文中存在事务,否则抛出异常。

REQUIRES_NEW每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。

8,多线程调用

在实际项目开发中,多线程的使用场景还是挺多的。如果Spring事务用在多线程场景中使用不当,也会导致事务无法生效。

.spring的事务有几种方式spring事务的隔离级别和传播行为是什么?

3、在java的service方法里怎么才算是一个数据库会话?和事务关系是什么?

比如

class ServiceA{

@Transactional

public void methodA(){

mapper1.method1();

mapper2.method2();

serviceB.methodB();

}

}

class ServiceB{

@Transactional(propagation=Propagation.required_new)

public void methodB(){

.....

}

}

那当调用ServiceA.methodA是不是就开启了一次数据库会话,但是有两次事务

4、Spring Boot中Service用@Transactional 注解在方法上,只在最外层方法起作用吗?

一般来说function2和function1用的是同一个Transaction。

这个取决于@Transactional 的 propagation设置(事务的传播性)

默认的是

@Transactional(propagation=propagation.REQUIRED)

也就是使用同一个Transaction。也可以按需求设置成 NESTED 或者 REQUIRES_NEW。

//inA.java

ClassA{

@Transactional(propagation=propagation.REQUIRED)

publicvoidaMethod{

Bb=newB();

b.bMethod();

}

}

//inB.java

ClassB{

@Transactional(propagation=propagation.REQUIRED)

publicvoidbMethod{//something}

}在上面这个例子中,传播性被设为了REQUIRED,注意,这是默认值,也即不进行该参数配置等于配置成REQUIRED。

REQUIRED的含义是,支持当前已经存在的事务,如果还没有事务,就创建一个新事务。在上面这个例子中,假设调用aMethod前不存在任何事

务,那么执行aMethod时会自动开启一个事务,而由aMethod调用bMethod时,由于事务已经存在,因此会使用已经存在的事务(也就是执行

aMethod之前创建的那个事务)。

对于这样的配置,如果bMethod过程中发生异常需要回滚,那么aMethod中所进行的所有数据库操作也将同时被回滚,因为这两个方法使用了同一个事务。

MANDATORY的含义是,支持当前已经存在的事务,如果还没有事务,就抛出一个异常。如果上例中aMethod的传播性配置为

MANDATORY,我们就无法在没有事务的情况下调用aMethod,因此,传播性为MANDATORY的方法必定是一个其他事务的子事务,当逻辑上独

立存在没有意义或者可能违反数据、事务完整性的时候,就可以考虑设置这样的传播性设置。

NESTED的含义是,在当前事务中创建一个嵌套事务,如果还没有事务,那么就简单地创建一个新事务。

REQUIRES_NEW的含义是,挂起当前事务,创建一个新事务,如果还没有事务,就简单地创建一个新事务。

请注意以上两者的区别,大多数情况下一上两种传播性行为是类似的,不过在事务回滚的问题上,以上两者有很大的区别。

首先,REQUIRES_NEW会创建一个与原事务无关的新事务,尽管是由一个事务调用了另一个事务,但却没有父子关系。

如果bMethod的传播性是REQUIRES_NEW,而抛出了一个异常,则bMethod一定会被回滚,而如果aMethod捕获并处理了这个

bMethod抛出的异常,那么aMethod仍有可能成功提交。当然,如果aMethod没有处理这个异常,那么aMethod也会被回滚。

如果aMethod在bMethod完成后出现了异常,那么bMethod已经提交而无法回滚,只有aMethod被回滚了。

而对于NESTED,虽然也会创建一个新事务,但是这个事务与调用者是有父子关系的相互依存的。

如果bMethod的传播性是NESTED,而抛出了一个异常,事务的回滚行为与REQUIRES_NEW是一致的。

但是如果aMethod在bMethod完成后出现了异常,bMethod同样也会被回滚。因为事实上,EJB中没有对于NESTED传播性的类似实现,NESTED并不是真正启动了一个事务,而是开启了一个新的savepoint。

NEVER的含义很简单,就是强制要求不在事务中运行,如果当前存在一个事务,则抛出异常,因此如果bMethod传播性是NEVER,则一定抛出异常。

NOT_SUPPORTED的含义是,强制不在事务中运行,如果当前存在一个事务,则挂起该事务。

SUPPORTS的含义是,支持当前事务,如果没有事务那么就不在事务中运行。SUPPORTS传播性的逻辑含义比较模糊,因此一般是不推荐使用的。

上一篇:没有了
技术干货
零基础学习
行业多年深耕,从这报名,学费立减800
  • 岳同学180****1241刚刚成功领取
  • 胡同学134****6431刚刚成功领取
  • 李同学150****6122刚刚成功领取
  • 张同学136****2231刚刚成功领取
  • 孙同学178****5521刚刚成功领取
  • 齐同学156****7788刚刚成功领取
猜你喜欢
查看更多
相关推荐
查看更多
现在学习,我的薪资能达到多少?
立即报名

联系我们:

Q:2638333071

鄂ICP备2023015464号