Spring 的官方的事务控制

By - Last updated: 星期五, 七月 21, 2017

事务是数据库(RDB)保证业务操作完整性的一种机制(强一致性)

  1. 事务在那里控制

业务层控制(Service 或Biz 或Business)

  1. 如何控制事务(不同的底层不同的控制)

如果是JDBC:—-Connnection

Connection.setAutoCommit(false)

Connection.commit()

Connection.rollback()

 

如果是Hibernate ——Session —SessionFactory

Transaction tx = session.beginTransaction();

Tx.commit();

Tx.rollback();

  1. Spring中如何控制事务(AOP 动态代理开发)

1) 原始对象(Service 调用Dao完成业务处理)

创建Service接口和ServiceImpl接口(由于Service需要使用Dao所以私有化然后进行注入)

 

 

 

2) 额外功能:

【1】     控制事务的代码MethodInterceptor注入 SessionFactory

  • org.springframework.orm.hibernate3.HibernateTransactionManager

 

 

 

【2】     事务属性:

 

 

隔离属性,ISOLATION

          解决并发问题的特点。

                 并发(同一时间,多个用户访问相同的数据)

  1. 数据的脏读:一个事务读取了另一个事务未提交的数据(隔离属性可以解决)ISOLATION_READ_COMMITIED      默认
  2. 数据的不可重复读:一个事务对相同的数据进行多次读取,结果不一致解决:ISOLATION_REPREATALBE_READ    对应的是数据库的行锁
  3. 数据的幻影读:在一个事务,进行统计工作中,对相同的表进行多次统计,但是结果不一致。ISOLATION_SERIALIZABLE_READ

 

传播属性

          事务嵌套:(Service调用其他Service(大型项目中才会有))

          普遍(Service-DAO)

 

          PROPAGATION_REQUIRED:当外部不存在事务,则开启事务,

                                                     当外部存在事务,则进行融合

                                                           增删改方法使用

          PROPAGATION_SUPPORTS:当外部不存在事务,则不开启事务

                                                     当外部存在事务,则融合事务

                                                           查询的时候使用

只读属性,默认是false

          如果你的事务是查询的时候,指定read-only 为true 提高系统效率

         

 

 

实战中应该这么写:

 

 

异常属性,

          Spring 默认对于RuntimeException 及其子类,  回滚策略

                                 Exception 及其子类   提交策略
  

          遇到一个异常的时候如果你想回滚:rollback-for=“异常的全限定名”

                                             如果你不想回滚的的话:no-rollback-for=”异        常的全限定名”

超时属性(timeout)-1

                 当数据被另一个事务锁住的时候,通过超时属性决定等待时间

3) 切入点

4) 组装切面

      

 

       开发中应该以包为基础进行切面。

      

 

 

 

实例:切面和属性