Spring的事务

来源:互联网 发布:电销数据购买 编辑:程序博客网 时间:2024/06/06 01:09

  前边我们讲过了Spring对JDBC的支持,即主要是在配置文件中配置一个普通的bean,class使用JDBCTemplate即可。今天我们来讲一讲Spring如何实现对事务的支持。

  1.事务

  事务就是一系列的动作的集合,他被当做一个独立的单元,这个单元中的动作要么全部完成,要么全部不完成。这样子事务就可以确定数据的一致性和完整性。

  事务的四个属性:原子性(事务是一个原子整体,一系列动作要么全部完成,要么全部不完成)、一致性(事务一旦提交,数据就处于一种一致性状态当中)、隔离性(不同事务可能同时处理同一个数据,为防止数据损坏,要将事务隔离开来)、持久性(事务一旦提交,无论任何系统错误,结果不受影响)。

  2.JDBC处理事务

  在业务方法开始前关闭事务默认提交行为并且开启一个新的事务、业务方法正常执行后提交事务、出异常时回滚事务、finally中关闭事务。对于数量众多的业务方法,若我们对每个方法都这样处理,显得太臃肿,前边的事务的处理很类似于我们Spring中的前置-返回-异常-后置的通知,所以我们自然而然的想到了使用Spring的AOP来处理事务。

  3.Spring来处理事务

  常用两种方法

  ①  编程式事务:写代码

  ②  声明式事务:只需在配置文件中进行配置就可以了,声明式事务最常用

  4. Spring中的事务管理器

  Spring根据不同的访问数据库技术的事务管理的API中抽象出了一整套的事务机制,开发人员不必了解底层的API,就可以使用这些事务机制。

  Spring的核心事务管理器是Interface platformTransaction,管理封装了一套独立技术的方法,无论使用那种Spring的事务管理策略(编程式或声明式),事务管理器都是必须的。

  5.Spring中的事务管理器的不同实现

  ① 对JDBC,使用类DataSourceTransactionManager,在程序中必须传入一个数据源。

  ② 对JTA,使用类JTATransactionManager,在服务器上撒航用JTA(Java Transanction API)进行事务管理

  ③ 对Hibernate,使用HibernateTransanctionManager管理事务。

  6.Spring管理事务的具体方法(针对JDBC)

  ① 配置一个bean,class为DataSourceTransanctionManager,并为其配置DataSource属性

  ② 引入tx的namespace,并在配置文件中是事务注解生效,即使用<tx:annotation-driven:transaction-manager="指向上边bean的id">

  ③ 在事务方法上添加@TransactionManager注解即可

  7. 事务的五大属性

  在@Transactional注解的属性中进行配置

  两个事务方法,T1调用T2

  ① 事务的传播行为,progagation=Progagation.REQUIRED

  当一个事务方法被另一个事务方法调用时,必须指定事务应该如何传播。事务的传播行为可以由主事务的@Transantion的属性progagation指定。常用值是required和required_new两个值,前者代表T2有事务在运行就可以,即T2方法使用T1的事务,若T1的事务不存在,则T2开启一个新的事务。

  后者表示T2必须开启一个自己的新事物,当运行到T2时,T1的事务挂起。默认值时required。

  ② 事务的隔离级别I,isolation=Isolation.COMMITED

  当一个程序或多个程序中的多个事务在操作同一组数据时,就可能出现一些意外的问题。如:脏读,T1读取了T2更新还未提交的数据,若T2回滚,T1读取到的数据就是临时且无效的;不可重复读,T1读取一个字段,T2更新该字段,之后T1再读取该字段,之久不同;幻读,T1读取一个字段,T2在该表掺入一些新的数据,T1再读取,就会多出几行。我们常用读已提交的内容来避免这些问题

  ③ 事务的不回滚异常

  我们可以指定Spring的该事务对出现的哪些异常类型不进行事务的回滚。

  ④ 事务的只读属性,readOnly="true"

  当我们只是从数据库中读取数据,而不会更新数据的时候,我们可以设置当前事务的只读属性为true。因为事务可在表和行上获得锁,事务运行时长期占用资源,并对数据库的整体性能产生影响,所以设置事务的只读属性可以帮助数据库引擎进行优化。

  ⑤ 事务的超时属性

  这个属性设定了在强制回滚事务前的时间,单位是秒。可防止事务长期占用资源。