您的位置:首页 > 编程语言 > Java开发

Spring事务管理

2016-03-26 11:34 633 查看
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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: