Spring事务管理总结

本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看
本文对应慕课网上课程Spring事务管理,详情可查看:点我git

1: 概念简析

  • 事务:逻辑的一组操做,要么一块儿成功,要么一块儿失败。
  • 事务的特性:
    • 原子性:不可分割,要么都发生,要么都不发生
    • 一致性:数据完整性保持一致
    • 隔离性:不一样的事务操做不能相互影响 (隔离级别)
    • 持久性:事务提交后,对数据的改变是永久的

PlatformTransactionManager:
事务管理器类,不一样持久化框架(例如JDBC,Hibernate,Mybatis|Mybatis好像使用和JDBC同同样的事务管理器实现类)对应不一样实现类,注意具体使用时查询github

TransactionDefinition:
数据库在查询数据时,因为种种缘由会发生如下三种问题.
  脏读 :读到还未修改的;
  不可重复读:在屡次读同一记录过程当中,另外事务提交修改,致使读取先后内容不一样;
  幻读 :和不可重复读相似,不过另一个事务插入而非修改sql





隔离级别 : 就是为了解决以上问题设定的事务相关的属性
READ_UNCOMMITED
READ_COMMITTED
REPEATABLE READ
SERIALIZABLE
以上四个级别一层层更严格,执行效率也愈来愈低.
最后的那个级别会致使全部事务呈线性执行数据库

传播行为:用来支持Spring的事务管理的属性,肯定哪些操做会在被包含在同一个事务里
PROPAGATION_REQUIRED 支持当前事务,若是不存在,就建立一个
PROPAGATION_SUPPORTS 具体查看相关文档
PROPAGATION_MANDATORY 。。。。
....编程

sql执行可使用模板,也能够拿到sqlConnection以后本身执行,可是执行模板确实是最方便的方法框架

TransactionStatus:能够获得当前事务的相关属性代理

2: 编程式事务管理

1:配置事务管理器platformTransactionManager
对于jdbc 须要datasourceTransactionManager 其中必须定义数据源属性dataSource,jdbc中是c3p0的链接池code

2:事务管理的模板(注意和sql模板不一样) transactionTemplate 事务管理模板,其属性就是上面对应的事务管理器.orm

3:在须要事务管理的代码处使用内部匿名类来执行运行sql的代码,这样将全部的操做后台的sql都会放在同一个事务中.xml

3:声明式事务管理

1:首先仍是要配置事务管理器

2:配置事务管理具体方法

  • 经典ProxyFactoryBean(使用动态代理的技术,用法已经渐渐废弃)
    须要配置TransactionProxyFactoryBean 属性包括target(标注哪一个Bean须要事务管理) 和 事务管理器(上面配置的),在bean的配置中经过property来配置事务的传播行为和隔离级别. (只能对一个目标进行配置,就是那个target,很差用)

  • 使用aop来进行事务管理
    使用基于AspectJ的Spring AOP来管理
    xml配置:
    配置通知 <tx:advice>
    配置切面 <aop:aspect>,在切面中配置通知和切点.

  • 注解配置:
    @Transactional便可配置;对须要的类配置,同时也可配置相关的隔离级别和传播行为属性.

相关的dao层配置请查看本系列文档关于Mybatis的总结

相关文章
相关标签/搜索