Spring--事务管理
来源:互联网 发布:淮南大数据小镇规划 编辑:程序博客网 时间:2024/06/06 14:18
事务:程序为了保证业务处理的完整性,执行的一个或多个SQL语句
管理:对事务中的SQL语句进行提交或回滚,叫做事务管理
什么时候使用?主要作用于Service的方法上
事务回顾:
--oracle:commit/rollback DML操作
--JDBC:自动commit
例如:转账:A账户转1000到B账户
A账户减少1000(update)
B账户增加1000(update)
设置:conn.setAutoCommit(false),最后commit/rollback
-------------------------------------------------------------------------------
使用案例:
public void someServiceMethod(){
try{
//开启事务
service.shareNote()
//事务提交
}catch{
//异常回滚
}
}
可以通过spring进行对事务的管理,不用对每一service进行修改,通过AOP进行管理(项目中每一个Dao都是一个事务)
-------------------------------------------------------------------------------
步骤:
1.配置Spring-transaction.xml
2.使用在Service层@Transactional标记
-------------------------------------------------------------------------------
可读可写:
service层中的SQL语句为select
@Transactional(readOnly=true) 设置为只读,在性能上有一定帮助
回滚特性:
默认RuntimeException回滚,其他异常不回滚,若要回滚其它异常则@Transactional(rollbackFor=IOException)
public void f1(){
//DB操作(insert)
//IOException
}
传播特性:
默认类型:REQUIRED
REQUIRED--支持当前事务,如果没有当前事务,就新建一个事务,这时最常见的选择
SUPPORTS--支持当前事务,如果没有当前事务,就以非事务方式执行
MANDATORY--支持当前事务,如果没有当前事务,就抛出异常
例如:
@Transactional
public void f1(){
//业务代码A
f2();
//若使用默认类型:REQUIRED,当f2()方法报错,则f2()方法回滚,f1()方法回滚
//
//
//业务代码B
}
public void f2(){
//业务代码C
}
隔离特性:
默认属性:READ_COMMITED
针对事务并发进行处理
脏读/幻读
=======================================================
利用AOP处理事务称为声明事务处理(AOP可以添加其他功能,也可以用来处理事务)
使用事务可简化try...catch操作
例如:批量删除笔记业务
Dao接口:
//彻底删除笔记(单条删除,并不是修改笔记状态)public int deleteNote(String id);-------------------------------------------------------------------------------
Mapper文件:
<!-- //彻底删除笔记(单条删除,并不是修改笔记状态) --> <delete id="deleteNote" parameterType="string"> delete from cn_note where cn_note_id = #{id} </delete>
-------------------------------------------------------------------------------
业务层接口:
//spring事务彻底删除笔记(单条删除,并不是修改笔记状态)String...表示动态参数,就是String[] 数组public void deleteNotes(String... ids);
-------------------------------------------------------------------------------
业务层实现类:
//spring事务彻底删除笔记(单条删除,并不是修改笔记状态)String...表示动态参数,就是String[] 数组//要么全部删除,要么都不删除,回滚@Transactionalpublic void deleteNotes(String... ids){for(String id : ids){int n = dao.deleteNote(id);if(n != 1){//删除笔记失败,抛出异常,触发事务的回滚throw new RuntimeException("删错了");}}}
-------------------------------------------------------------------------------
测试业务层代码:
@Test//测试使用事务批量删除笔记(本质是delete笔记)public void testDeleteNotes(){//调用动态参数的时候,可以不创建数组,直接写参数//String ids = {"id1","id2"};可以不用创建数组//抛出异常后回滚service.deleteNotes("fd39f2e4d0df435281aaa4c29aecbc85","12121212");}由于第二个笔记的ID是错误的,所以会回滚,其次在前代码使用了AOP,输出业务层方法的耗时,对抛出的异常进行写日志,这些AOP切面编程不会对事务产生影响,但是要注意在这些AOP中,若对异常进行了处理,一定要再次抛出,否则@Transactional不会回滚,因为要捕获到异常后才回滚
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
- 事务管理之Spring事务管理
- Spring事务管理
- spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring 事务管理
- Spring事务管理
- spring 事务管理
- spring 事务管理
- spring 事务管理
- spring事务管理
- Spring 事务管理
- Spring事务管理
- spring事务管理
- spring 事务管理
- android多线程之三:终止线程池的方法
- Domain Adaptation总结(2017.9)
- 33.List的一阶函数操作代码实战详解
- JS中判断字符串中出现次数最多的字符及出现的次数
- caffe 训练log可视化
- Spring--事务管理
- 9月3日训练日记
- Unity3D
- Tensorflow训练卷积神经网络并保存模型,加载模型并导入手写图片测试
- 20170903
- Oracle数据库CPU使用率过高问题处理
- Redis学习
- 前台学习随手记
- 深入理解JAVA虚拟机读书笔记----走进JAVA