spring的事务处理
1.什么是事务:
事务时一组sql语句的集合,集合中有多条sql语句(insert、update、select、delete)。我们希望这些sql语句都能成功,或者都能失败。这些sql语句的执行是一致的,作为一个整体执行。
2.什么时候使用事务:
当操作涉及到多个表或者多个sql语句(insert、update、select、delete),需要保证这些语句都成功(或都失败)时。
在java代码中,事务应放在哪?
放在service接口的实现类的业务方法上(因为该业务方法可能会涉及到多个dao的调用)。
3.通常使用jdbc访问数据库,还有mybatis访问数据库,如何处理事务?
jdbc访问数据库:
Connection conn;
conn.commit();
conn.rollback();
mybatis访问数据库:
SqlSession.commit();
SqlSession.rollback();
hibernate访问数据库:
Session.commit();
Session.rollback();
4.第3问中事务的处理方式,有哪些不足之处?
1)不同的数据库访问技术,处理事务的对象方法不同。需要去了解不同数据库访问技术使用事务的原理。
2)掌握多种数据库中事务的处理逻辑(什么时候提交、回滚事务)。
3)需要了解处理事务的多种方法
总结:多种数据库的访问技术有不同的事务处理机制、对象、方法。
5.如何解决不足。
spring提供了一种处理事务的统一模型,能使用统一步骤(方式)来完成多种不同数据库访问技术的事务处理。
(声明式事务:把事务相关资源和内容提供给spring,spring就能处理事务、提交回滚。几乎不用写代码)
6.处理事务,需要做什么,以及怎么做。
spring处理事务的模式,其使用步骤都是固定的:
1)使用事务管理器对象,代替完成commit、rollback。
事务管理器是PlatformTransactionManager接口对象。其主要用于完成事务的提交、回滚,及获取事务的状态信息。
实现类:spring把每一种数据库访问计数对应的事务处理类都创建好了。
如:
mybatis访问数据库——spring创建了DataSourceTransactionManager
hibernate访问数据库——spring创建的是HibernateTransactionManager
如何使用:需要声明数据库访问计数对应的事务管理器实现类,即在spring的配置文件中使用<bean>声明。
例如:使用mybatis数据库,应在配置文件中
<bean id="自定义" class="...DataSourceTransactionManager">
2)说明需要事务的类型
事务定义接口TransactionDefinition中定义了事务描述相关的三类常量:事务隔离级别、事务传播行为、事务默认超时时限,及对它们的操作。
①事务的五个隔离级别
这些常量均是以ISOLATION_开头。即形如ISOLATION_×××。
- DEFAULT:采用DB默认的事务隔离级别。MySQL默认为REPEATABLE_READ;Oracle默认为READ_COMMITED。
- READ_UNCOMMITTED:读未提交。未解决任何并发问题。
- READ_COMMITED:读已提交。解决藏独,存在不可重复读与幻读。
- REPEATABLE_READ:可重复度。解决藏独、不可重复读,存在幻读。
- SERLALIZABLE:串行化。不存在并发问题,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的。
②事务的七个传播行为
所谓事务传播行为是指,处于不同事务中的方法在相互调用时,执行期间事务的维护情况。如:A事务中的方法doSome()调用B事务中的方法doOther(),在调用执行期间事务的维护情况,就成为事务传播行为。事务传播行为是加在方法上的。
事务传播行为常量都是以PROPAGATION_开头,形如PROPAGATION_×××。
PROPAGATION_REQUIRED(掌握)
指定的方法必须在事务内执行。若当前存在事务就加入到当前事务中;若当前没有事务,则创建一个新事物。这种传播行为是最常见的选择,也是sprig默认的事务传播行为。
PROPAGATION_REQUIRES_NEW(掌握)
总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
PROPAGATION_SUPPORTS(掌握)
指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行(查询操作,有无事务都可)。
PROPAGATION_MANDATORY
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
③事务默认超时时限
表示一个方法最长的执行时间,如果方法执行时超过了时间,事务就回滚。单位秒,整数值,默认-1.
3)事务提交事务、回滚事务的时机
①当业务方法执行成功,无异常抛出,spring会在方法执行完毕后自动提交事务(调用事务管理器的commit)。
②当业务方法抛出运行时异常或ERROR,spring自动执行回滚(调用事务管理器的rollback)。
运行时异常的定义:RuntimeException和它的子类都是运行时异常,例如NullPointException、NumberFormatExcept。
③当业务方法抛出非运行时异常(主要是受查异常时),提交事务。
受查异常的定义:在写代码时,必须处理的异常。例如IOException、SQLException。
总结spring的事务
1.管理事务的是 事务管理器和其实现类
2.spring的事务是一个统一模型
1)使用<bean>指定使用的事务管理器实现类
2)指定哪些类、哪些方法需要加入事务的功能
3)指定方法需要的隔离级别、传播行为、超时时限
网友评论