事务:ACID特性
原子性,一致性,隔离性和持久性
为了保证一个业务操作的完整完成,避免其他业务过程的干扰
编程式事务处理:
conn = DBUtil.getConnection();
try{
//开始事务
conn.setAutocomit(false);
//业务操作过程
select..update..delete
//提交事务
conn.commit;
}catch(e){
//回滚事务
conn.rollback();
}finally(){
//释放资源
conn.close();
}
Spring 利用AOP,实现了声明式业务管理:
try{
@Before//开启事务
利用反射调用业务方法
@AfterReturning//提交事务
}catch(e){
@AfterThrowing//回滚事务
}finally(){
@After//释放资源
}
声明式事务:
@Transactional//事务注解
public updateNote(){
...
insert
update
...
//抛出异常(只抓RuntimeException和其子类型)
//自动回滚到Before位置
}
配置事务管理器:
<!-- 配置事务管理器:基于dataSource的事务管理器 -->
<bean id="txMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 用于驱动@Transactional 注解 -->
<tx:annotation-driven transaction-manager="txMgr"/>
@Transactional的底层还是依赖AOP
@Transactional可以标注在类上,类中所有的方法都可以被事务控制
****************************************************************************
事务的属性:
@Transaction(readOnly=true) 只读属性,方法运行期间,对数据库的操作仅限于读。加此属性的优点是可以让仅查的方法提高效率。
@Transaction(isolation=Isolation.READ_COMMITTED) 只操作提交的
READ_UNCOMMITTED最低隔离(不安全性能好)
SERIALIZABLE完全串型操作(性能最差最安全)
REPEATABLE_READ可重复读取
如果不写默认READ_COMMITTED,一般使用这个。
@Transaction(propagation=Propagation.REQUIRED) 一个事务与多个事务连成一个整体,默认值为REQUIRED。当业务层中调用业务层方法时,多个事务会合并成一个事务。
REQUIRES_NEW属性表示必须创建新事务,如果当前有事务,则当前事务挂起。
NEVER绝不参加事务。
REQUIRES_NESTED 嵌套,事务必须潜逃到其他事务中。
MANDATORY不能参与事务。
NOT_SUPPORTED不支持,可以在事务中调用,但是不参与不支持事务,会抛异常。
SUPPORTS支持事务,可以在事务中调用,但单独调用方法则没有事务保护