spring的事务处理
-
什么是事务
在mysql中,提出了事务,事务是指一组sql语句的集合,集合中有多条sql语句 可能是insert,update,select,delete,我们希望这些多个sql语句都能成功, 或者都失败,这些sql语句的执行是一致的,作为一个整体执行。
-
在什么时候想到使用事务
当我的操作涉及到多个表,或者多个sql语句的insert,update,delete,需要保证 这些语句都是成功才能完成我的功能,或者都失败,保证操作是符合要求的。 在java代码中写程序,控制事务,此时事务应该放在哪里? service类的业务方法上,因为业务方法会调用多个dao方法,执行多个sql语句
-
通常使用jdbc访问数据库,还有mybatis访问数据库怎么处理事务
jdbc访问数据,处理事务 Conncotion conn; conn.commit(); conn.rollback(); mybatis访问数据库,处理事务, SqlSession.commit(); SqlSession.rollback();
-
3中事务的处理方式有什么不足
- 不同的数据库访问技术,处理事务的对象,方法不同,
需要了解不同数据库访问技术使用事务的原理 - 掌握多种数据库中事务的处理逻辑。什么时候提交事务,什么时候回滚事务
- 处理事务的多种方法。
总结:就是多种数据库的访问技术,有不同的事务处理机制,对象,方法
- 不同的数据库访问技术,处理事务的对象,方法不同,
-
怎么解决不足
spring提供了一种事务处理模型,能使用统一的步骤(方式),完成多种不同的数据库访问技术的事务处理。 使用spring的事务处理机制,可以完成mybatis访问数据库的事务处理。 使用spring的事务处理机制,可以完成hibernate访问数据库的事务处理。
-
处理事务,需要怎么做,做什么
spring处理事务的模型,使用的步骤是固定的,把事务的使用信息提供给spring就可以了
-
事务内部提交,回滚事务,使用的事务管理器对象,代替完成commit,rollback
事务管理器是一个接口和它的众多实现类。
接口:PlatformTransactionManager,定义了事务重要方法 commit,rollback
实现类:spring把每一种数据库访问技术对应的事务处理器都创建好了。
mybatis访问数据库------spring创建好的是DataSourceTransactionManager
hibernate访问数据库-----spring创建好的是HibernateTransactionManager怎么使用:需要告诉spring,使用的是哪种数据库访问技术,
声明数据库访问技术对应的是实现类,在spring的配置文件中使用声明就可以了例如:要使用mybatis访问数据库,应该在xml配置文件中
<bean id="xxx" class="...DataSourceTransactionManager" />
-
业务方法需要什么样的事务,声明需要事务的类型。
声明方法需要的事务:-
事务的隔离级别:有4(+1个默认)个值
- READ_UNCOMMITTED:读未提交。为解决任何并发问题。
- READ_COMMITTED:读未提交。解决脏读,存在不可重复读与幻读。
- REPEATABLE_READ:可重复读。解决脏读,不可重复读,存在幻读。
- SERIALIZABLE:串行化。不存在并发问题。
-
事务的超时时间:表示一个方法最长的执行时间,如果方法执行时超过了时间,事务就回滚。
单位是秒,整数值,默认是-1.(一般不设置,默认) -
事务的传播行为:控制业务方法是不是有事务,是什么样的事务。
7个传播行为,表示你的业务方法调用时,事务在方法之间时如何使用的。 **PROPAGATION_REQUIRED** **PROPAGATION_REQUIRES_NEW** **PROPAGATION_SUPPORTS** 以上三个需要掌握 PROPAGATION_MANDATORY PROPAGATION_NESTED PROPAGATION_NEVER PROPAGATION_NOT_SUPPORTED
-
-
事务提交事务,回滚事务的时机
- 当你的业务方法,执行成功,没有异常抛出,当方法执行完毕,spring在方法执行后提交事务。
- 当你的业务方法抛出运行时异常或error,spring执行回滚,调用事务管理器的rollback。
运行时异常的定义:RuntimeException和它的子类都是运行时异常 - 当业务方法抛出非运行时异常,主要是受检异常时,提交事务。
受检异常:在写代码时必须处理的异常。
-
总结spring的事务:
-
管理事务的是 事务管理器和它的实现类
-
spring的事务是一个统一模型
- 指定要使用的事务管理器的实现类,使用
- 指定哪些类,哪些方法需要加入事务的功能
- 指定方法需要的隔离级别,传播行为,超时
你需要告诉spring,你的项目中类信息,方法的名称,方法的事务传播行为。
spring框架中提供的事务处理方案
-
适合中小项目,注解方案。
spring框架自己调用aop实现给业务方法增加事务的功能,使用@Transactional注解增加事务。
@Transactional注解是spring框架自己的注解,放在public方法的上面,表示当前方法具有事务。
可以给注解的属性赋值,表示具体的隔离级别,传播行为,异常信息等等
使用@Transactional注解的步骤:- 需要上面事务管理器对象
<bean id="xx" class="DataSourceTransactionManager"></bean>
- 开启事务注解驱动,告诉spring框架,我要使用注解的方式管理事务。
spring使用aop机制,创建@Transactional注解所在的类代理对象,给对象加入事务的功能。
spring给业务方法加入事务:
在你的业务方法执行之前,先开启事务,在业务方法之后提交或回滚事务,使用aop的环绕通知。 - 在方法上加入@Transactional注解
- 需要上面事务管理器对象
-
适合大型项目,有很多的类,方法,需要大量的配置事务,使用aspectJ框架功能,在spring配置文件中
声明类,方法需要的事务。这种方式,业务方法和事务配置完全分离
实现步骤:都是在xml配置文件中实现
- 要使用aspectJ框架,需要加入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 声明事务管理器对象
<bean id="xx" class="DataSourceTransactionManager">
- 声明方法需要的事务类型(配置方法的事务属性[隔离级别,传播行为,超时])
- 配置aop:指定哪些类需要创建代理。