Spring 官方版的事务控制
- 什么是事务?
事务是数据库(RDB)保证业务操作完整性的一种机制(强一致性)
- 事务在那里控制
业务层控制(Service 或Biz 或Business)
- 如何控制事务(不同的底层不同的控制)
如果是JDBC:----Connnection
Connection.setAutoCommit(false)
Connection.commit()
Connection.rollback()
如果是Hibernate ------Session ---SessionFactory
Transaction tx = session.beginTransaction();
Tx.commit();
Tx.rollback();
- Spring中如何控制事务(AOP 动态代理开发)
1) 原始对象(Service 调用Dao完成业务处理)
创建Service接口和ServiceImpl接口(由于Service需要使用Dao所以私有化然后进行注入)
2) 额外功能:
【1】 控制事务的代码MethodInterceptor注入 SessionFactory
- org.springframework.orm.hibernate3.HibernateTransactionManager
【2】 事务属性:
隔离属性,ISOLATION
解决并发问题的特点。
并发(同一时间,多个用户访问相同的数据)
- 数据的脏读:一个事务读取了另一个事务未提交的数据(隔离属性可以解决)ISOLATION_READ_COMMITIED 默认
- 数据的不可重复读:一个事务对相同的数据进行多次读取,结果不一致解决:ISOLATION_REPREATALBE_READ 对应的是数据库的行锁
- 数据的幻影读:在一个事务,进行统计工作中,对相同的表进行多次统计,但是结果不一致。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) 组装切面
开发中应该以包为基础进行切面。
实例:切面和属性
: