Spring事务管理
2016-03-26 11:34
633 查看
Spring事务管理
使用时机:两个或两个以上操作,至少有一个操作涉及DML语句
con.executeUpdate();//自动commit
Spring事务管理,可以在不修改原有组件代码情况下,通过追加配置追加事务控制逻辑。
##XML配置事务(了解)
特点:只需要对XML修改;配置复杂
配置使用简单,灵活.
使用步骤
--定义一个bean组件,
DataSourceTransactionManager
--启用事务注解配置@Transactional
<tx:annotation-driven transaction-manager="事务管理bean的ID"/>
--在业务组件上或方法上追加@Transactional
**Spring声明式事务(以配置方法事务管理)
Spring编程式事务(基于java编码事务管理)
默认可读可写。建议查询方法用只读。
@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
}
#事务的作用和意义
作用:可以保障一组操作的完整性使用时机:两个或两个以上操作,至少有一个操作涉及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
}
相关文章推荐
- ZooKeeper Watch Java API浅析getData
- 白话Spring(中级篇)---注解(2)
- Abstract class VS Interface2
- 用Java实现各种排序(2)---希尔排序
- java的继承
- Java中千变万化字符串
- Java 二叉树遍历相关
- Java ThreadLocal
- 去除MyEclipse 中新建servlet多余的注释问题
- 简单谈谈java的异常处理(Try Catch Finally)
- Eclipse安装svn的过程记录
- Java 二叉查找树转化为排序的循环双链表
- spring Resolving views
- JAVA Class String
- 二、Java学习之语言基础(1)
- zookeeper错误记录一;Cannot open channel to 2 at election address s1/192.168.253.131:3888 java.net.Connec
- Spring 注解详解
- 【字符编码】Java字符编码详细解答及问题探讨
- 判断java中两个对象是否相等
- 接口与内部类(Java核心技术卷Ⅰ)