Spring的事务处理

1、什么是事务

事务是指一条sql语句的集合,集合中有多条sql语句,可能是insert,可能是update,select,update。我们希望这些sql语句同时成功或者同时失败,这些sql语句的执行是一致的,作为一个整体执行。

2、在什么时候想到使用事务

当我的操作,涉及到多个表,或者是多个sql语句的insert,update,delete。需要保证这些语句都是成功才能完成我的功能,或者都失败来保证我的操作是符合要求的,例如:转账功能,将A账户的余额转入B,那么必须确保A的账户余额减少,并且同时B的账户余额增加,这两个步骤必须同时成功或者同时失败,否则会出现问题。

在java代码中写程序,控制事务,此时事务应该放在Service接口的实现类的业务方法中,因为业务方法会执行和调用多个dao方法,执行多个sql语句

3、通常使用JDBC以及mybatis访问数据库,应该怎么处理事务

jdbc访问数据库,处理事务:Connection conn; conn.commit(); conn.rollback();
mybatis访问数据库处理事务: sqlSession.commit(); sqlSession.rollback();

4、第3点中事务的处理方式,有什么不足?

  • 不同的数据库访问技术,处理事务的对象,方法不同,一个是Connection,一个是SqlSession,需要了解不同的数据库访问技术的事务原理
  • 掌握多种数据库中事务处理的逻辑,什么时候提交事务,什么时候回滚事务
  • 处理事务的多种方法

5、如何解决

spring提供了一种处理事务的统一模型,能使用统一步骤,方式完成多种不同数据库访问技术的事务处理。

使用spring的事务处理机制,可以完成mybatis访问数据库的事务处理
使用spring的事务处理机制,可以完成hibernate访问数据库的事务处理

6、处理事务,需要怎么做,做什么?

spring处理事务的模型,使用步骤都是固定的。把事务的信息提供给spring就好了

  • 事务内部提交,回滚事务,使用的是事务管理器对象,代替你完成commit和rollback,事务管理器是一个接口和他的众多实现类。
    接口:PlatFromTransactionManager,定义了事务的重要方法commit,rollback
    实现类:spring把每一种数据库访问技术的事务处理类都创建好了。
    如果你使用mybatis访问数据库-------spring创建好的是DataSourceTransactionManager
    如果你使用的是hibernate-------spring创建好的是HibernateTransactionManager
    使用:你需要告诉spring你使用的是哪种数据库的访问技术。声明数据库访问技术对于技术的事务管理器实现类,在spring配置文件中使用<bean>标签就可以了,例如使用mybatis
    <bean id = “xxx” class="…DataSourceTranscationManager">

  • 你的业务方法需要什么样的事务呢,说明需要事务的类型。说明方法需要的事务:
    1、事务的隔离级别(5个)

    • ISOLATION_DEFAULT:
      Mysql默认是REPEATABLE_READ 可重复读
      Oracle默认是READ_COMMITTED 读已提交

    • ISOLATION_READ_UNCOMMITTED 读未提交

    • ISOLATION_READ_COMMITTED 读已提交

    • ISOLATION_REPEATABLE_READ 可重复读

    • ISOLATION_SERIALIZABLE 串行化。不存在并发问题

    2、事务的超时时间:表示一个方法执行的最长时间,如果方法执行的时间超过了这个值,事务就回滚,单位是秒,整数值,默认时-1,表示无限时间,一般不主动设置,因为影响的因素太多了

    3、事务的传播行为:控制业务方法是不是有事务的,是什么样的事务的

    • PROPAGATION_MANDATORY

    • PROPAGATION_NESTED

    • PROPAGATION_NEVER

    • PROPAGATION_NOT_SUPPORTED

    • PROPAGATION_REQUIRED:指定的方法必须在事务内执行,如果存在事务,就加入到当前事务中,如果没有事务,就创建一个新的事务
      Spring的事务处理

    • PROPAGATION_REQUIRES_NEW:指定的方法支持当前事务,但是如果当前没有事务,也可以非事务方式执行。查询操作的话就可以设置成这个,有事务没事务都能执行。
      Spring的事务处理

    • PROPAGATION_SUPPORTS :总是新建一个事务,如果当前存在事务,就将当前事务挂起,知道新事务执行完毕。
      Spring的事务处理
      事务都是加给方法的

4、提交事务,回滚事务的时机

  • 1、当你的业务方法,执行成功,没有异常抛出,当方法执行完毕时,spring就会在方法执行后自动提交事务(commit)

  • 2、当你的业务方法抛出运行时异常或者ERROR时候,spring执行回滚,调用事务管理器的rollback,
    运行时异常的定义:RuntimeException和他的子类,例如NullPointException和NumberFormatException

  • 当你的业务方法抛出非运行时异常的时候,主要就是受查异常时,提交事务。
    受查异常:在你写代码时必须处理的异常,例如IOException,SQLException

7、总结spring的事务

  1. 管理事务的是 事务管理器和他的实现类

  2. spring的事务是一个统一模型,
    1、指定要使用的事务管理器的实现类,使用<bean>
    2、指定哪些类,哪些方法需要加入事务的功能
    3、指定方法需要的隔离级别,传播行为,超时时间

  3. 你需要告诉spring,你的项目中类的信息,方法的名称,方法的事务传播行为。