Spring事务管理
#事务的作用和意义
作用:可以保障一组操作的完整性
使用时机:两个或两个以上操作,至少有一个操作涉及DML语句
#回顾下JDBC事务管理
JDBC默认自动提交.
con.executeUpdate();//自动commit
public void f1(){
try{
con.setAutoCommit(false);//关闭自动提交
con.executeUpdate(更新1SQL)
int rows = con.executeUpdate(更新2SQL)
if(rows==0){
throw 异常;
}
con.commit();//提交事务
}catch(){
con.rollback()//回滚事务
}
}
Mybatis:默认非自动提交
#Spring事务管理
Spring整合JDBC或Mybatis后,事务是自动提交。
Spring事务管理,可以在不修改原有组件代码情况下,通过追加配置追加事务控制逻辑。
public void someServiceMethod(){
try{
//Dao操作1
//Dao操作2
//提交事务
}catch(){
//回滚事务
}
}
public class SomeService{
public void f1(){
//更新1
//更新2
}
}
public class SomeService$Proxy{
public void f1(){
try{
调用SomeService.f1();
//提交事务 txManager.提交事务
}catch(){
//回滚事务 txManager.回滚事务
}
}
}
##XML配置事务(了解)
特点:只需要对XML修改;配置复杂
##注解配置事务(掌握)
特点:需要对XML修改,并且在代码中追加注解标记(@Transactional)
配置使用简单,灵活.
使用步骤
--定义一个bean组件,
DataSourceTransactionManager
--启用事务注解配置@Transactional
<tx:annotation-driven transaction-manager="事务管理bean的ID"/>
--在业务组件上或方法上追加@Transactional
**Spring声明式事务(以配置方法事务管理)
Spring编程式事务(基于java编码事务管理)
#Spring事务特性
--读写特性
默认可读可写。建议查询方法用只读。
@Transactional(readOnly=true)
--回滚特性
默认遇到运行时异常回滚;检查类异常不回滚
@Transactional(rollbackFor={IOException.class})
public void f1(){
//执行SQL操作
//执行文件操作,抛出了IOException
}
作用:遇到IOException也要撤销前面SQL操作
--传播特性
默认为REQUIRED。
只有两个事务管理方法发生关联时涉及。
@Transactional(propagation=Propagation.REQUIRED)
@Transactional
public void f1(){
//执行SQL1处理
f2();
};
@Transactional(propagation=REQUIRED)
public void f2(){
//执行SQL2处理
//执行SQL3处理
};
--隔离特性
当发生事务并发时会涉及隔离控制。
事务隔离级别如下:
----READ_UNCOMMITED 读未提交
----READ_COMMITED 读已提交
----REPEATABLE_READ 可重复读
----SERIALIZABLE 序列化操作
----DEFAULT 默认级别,根据数据库设定
Oracle为READ_COMMITED
级别越高并发处理能力越差,安全性越好
级别越低并发处理能力越强,安全性越差
@Transactional(isolation=Isolation.REPEATABLE_READ)
public void f1(){
//查询id=1记录
//处理记录信息
//查询id=1记录
//处理记录信息
}
public void f1(){
//执行逻辑1
synchornized(){
//执行逻辑2--》对同一个数据操作
}
//执行逻辑3
}
@Transactional(isolation=Isolation.DEFAULT)
public void f1(){
//逻辑处理1
select * from emp where eno=101
for update;//将eno=101锁住
//逻辑处理2,对eno=101操作,完毕解锁
//逻辑处理3
}