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不会回滚,因为要捕获到异常后才回滚

-------------------------------------------------------------------------------


-------------------------------------------------------------------------------

原创粉丝点击