Spring 学习总结 七

Spring事务

事务的概念

什么是事务?
事务是一些sql序列的集合,是多条sql,作为一个整体执行。要么都成功,要么都失败。

mysql执行事务
beginTransaction 开启事务
insert into student() values...
select * from student where id = 1001
update school set name=xxx where id = 1005
endTransaction 事务结束

什么情况下需要使用事务?
一个操作需要多条(2条或2条以上的sql)sql语句一起完成,操作才能成功。

在程序中事务在哪说明

事务:加在业务类的方法上面(public 方法上面),表示业务方法执行时,需要事务的支持。

public class AccountService{

  private AccountDao dao;
  private MoneyDao dao2;
  //在service(业务类)的public方法上面,需要说明事务。
  public void trans(String a, String b , Integer money){
     dao.updateA();
     dao.updateB();
     dao2.insertA();
  } 
}

public class AccountDao{

  public void updateA(){}
  public void updateB(){}
}

public class MoneyDao{

  public void insertA(){}
  public void deleteB(){}
}
事务管理器

1、不同的数据库访问技术,处理事务时不同的

  • 使用jdbc访问数据库,事务处理。
public void updateAccount(){
   Connection conn = ...
   conn.setAutoCommit(false);
   stat.insert;
   stat.update();
   conn.commit();
   con.setAutoCommit(true)
} 
  • mybatis执行数据库,处理事务
public void updateAccount(){
   SqlSession session = SqlSession.openSession(false);
   try{
      session.insert("insert into student...");
      session.update("update school set ... where ... ");
      session.commit();
   }catch(Exception e){
      session.rollback();
   }
}

2、spring 统一管理事务,把不同的数据库访问技术的事务处理统一起来。
使用spring的事务管理器,管理不同数据库访问技术的事务处理。开发人员只需要掌握spring 的事务处理一个方案,就可以实现使用不同数据库访问技术的事务管理。
管理事务面向的是spring,由spring管理事务,做事务提交,事务回顾。

3、spring事务管理器
Spring框架使用事务管理器对象,管理所有的事务。
事务管理器接口:PlatformTransactionManager
作用:定义了事务的操作,主要是commit(),rollback();
事务管理器由很多的实现类:一种数据库的访问技术有一个实现类。由实现类具体完成事务的提交,回滚。
意味着:jdbc或者mybatis访问数据库有自己的事务管理器实现类:DataSourceTransactionManager
hibernate框架,他的事务管理器实现类:HibernateTransactionManager。

事务管理器工作方式:
在这里插入图片描述
4、事务的提交和回滚的时机
什么时候提交事务,回滚事务?
当你的业务方法正常执行时,没有异常,事务是提交的。如果你的业务方法抛出了运行时异常,事务时回滚的

异常分类:
Error:严重错误,回滚事务
Exception:异常类,可以处理的异常情况
1)运行时异常:RuntimeException和他的子类都是运行时异常,在程序执行过程中抛出的异常,常见的运行时异常:NullPointerException、NumberFormatExeption、ArlthmeticException、IndexOutOfBoundsException.
2)受查异常(编译时异常):编写java代码的时候,必须出来的异常,例如IOException,SQLExecption,FileNotFoundException。

怎么记忆:
方法中抛出了运行时异常,事务回滚,其他情况(正常执行方法,受查异常)就是提交事务

5、事务使用的AOP的环绕通知
环绕通知:可以在目标方法的前后都能增强功能,不需要修改源代码

spring中给业务方法在执行时,增加上事务的切面功能
@Around(execution(* 所有的业务类中的方法))
public Object myAround(ProceedingJoinPoint pjp){
    try{
    PlatformTransactionManager.beginTransaction(); //使用spring的事务管理器,开启事务
    pjp.proceed();执行目标方法 //dosome()
    PlatformTransactionManager.commit();//业务方法正常执行,提交事务
    }catch(Exception e){
         PlatformTransactionManager.rollback(); //业务方法正常执行,回滚事务。
    }
}
事务定义接口 TransactionDefinition

TransactionDefinition接口。定义了三类常量,定义了有关事务控制的属性。
事务的属性:1)隔离级别 2)传播行为 3)事务的超时
给业务方法说明事务属性。和ACID不一样。

1、隔离级别:控制事务之间的影响程度
5个值,只有四个隔离级别

  • DEFAULT:采用DB默认的事务隔离级别。MySql的默认为REPEATABLE_READ;Oracle默认为READ_COMMITTED。
  • READ_UNCOMMITTED:读未提交。为解决任何并发问题。
  • READ_COMMITED: 读已提交。解决脏读,存在不可重复读与幻读。
  • REPEATABLE_READ:可重复读。解决脏读,不可重复读,存在幻读
  • SERIALIZABLE:串行化。不存在并发问题。

2、超时时间
超时时间,以秒为单位。整数值,默认是-1
超时时间:表示一个业务方法最长的执行时间,如果到达时间没有执行完毕,spring回滚事务。

3、传播行为
传播行为有7个值
传播行为:业务方法在调用时,事务在方法之间的,传递和使用。
使用传播行为,标识方法有无事务
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_SUPPORTS
以上三个需要掌握的。
PROPAGATION_MANDATORY
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED

1)PROPAGATION_REQUIRED:spring默认传播行为,方法在调用的时候,如果存在事务就是使用当前的事务,如果没有事务,则新建事务,方法在新事物中执行。
在这里插入图片描述
2)SUPPORTS:支持,方法有事务可以正常执行,没有事务也可以正常执行。
3)REQUIRES_NEW:方法需要一个新事务。如果调用方法时,存在一个事务,则原来的事务暂停,直到新事务执行完毕。如果方法调用时,没有事务,则新建一个事务,在新事务执行代码。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值