第五章 Spring 事务

5.1事务

1、什么是事务?一些sql语句序列的集合,是多条sql,要作为一个整体来执行,要么全部成功,要么全部失败。

mysql执行事务:
beginTransaction//开始事务
insert into student ....;
select * from student ......
endTransaction//事务结束

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

5.2 在程序中事务在哪里说明

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

5.3 事务管理器

5.3.1不同的数据库访问技术,处理事务的方式是不同的

1)使用jdbc访问数据库,事务处理

public void Account(){
Connecton con = ..
con.setAutoCommit(false);
stat.insert();
stat.update;
con.commit();
con.setAutoCommit(true);
}

2)mybatis执行数据库操作,处理事务

public void updateAccount(){
    SqlSession session = SqlSession.openSession(false);
    try{
          session.insert("insert into ...");
          session.update("update ...");
          session.commit();
    }catch(Exception e){
      session.rollback():
    }
    
}

5.3.2 spring统一事务管理事务,把不同的数据库访问技术的事务处理统一起来

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

5.3.3 Spring事务管理器

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


事务管理的工作方式

5.3.4 事务的提交和回滚时机

什么时候提交、回滚事务?
当业务方法正常执行时,没有异常,事务自动提交。如果业务方法抛出了运行时异常,事务是回滚的。
异常的分类:
Error:严重错误,回滚
Exception:异常类,可以处理的异常情况
1、运行时异常:RuntimeException和他的子类都是运行时异常,在程序执行过程中抛出的异常。常见的运行时异常:NullPointException,NumberFormatException,IndexBoundException.......
2、受查异常:在编写java代码的时候,必须要处理的异常,例如:IOException,SQLException,FileNotFoundException....,受查异常默认是提交事务
总结
方法中抛出了运行时异常,回滚;其他情况(正常执行方法、受查异常)就提交事务

5.3.5 事务使用的AOP的环绕通知

环绕通知:在目标方法的前和后都能增强功能,不需要修改代码。

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

5.4 事务定义接口TransactionDefinition

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

5.4.1 隔离级别

控制事务之间影响程度的,有5个值,但实际只有4个隔离级别
1、default:采用DB默认的事务隔离级别。MySql的默认为repeatable_read,orcal的默认为:read_committed
2、read_uncommitted:读未提交。未解决任何并发问题
3、read_committed:读已提交。解决脏读、存在不可重复读与幻读
4、repeatable_read:可重复读,解决脏读、不可重复读、存在幻读
5、serializable:串行化,不存在并发问题(事务安全性最高,但是效率最低)

5.4.2 事务的超时时间

事务的超时时间是以秒为单位的,默认为-1。该时间是表示一个业务方法最长的执行时间。到达时间没有执行完毕,spring回滚事务。-1表示没有时间限制。

5.4.3传播行为

传播行为有7个值
传播行为:业务方法在调用时,事务在方法之间的传递和使用
使用传播行为,标志方法有无事务
1、propagation_required:Spring默认的传播行为,方法在调用的时候,如果存在事务,则使用当前的事务,如果没有事务,则新建事务,方法在新建事务中执行
2、propagation_supports:有事务可以执行,没有事务也可以执行(比如:查询操作)
3、propgation_required_new:方法需要一个新事务。如果在调用方法时,则原来的事务暂停,知道新事务执行完毕。如果方法调用时,没有事务,则新建一个事务,在新事务中执行代码。

5.5 Spring框架使用自己的注解Transactional控制事务

@Transactional注解,使用注解的属性来控制事务(隔离级别、传播行为、超时)

  • 属性:
    1、prooagation:事务的传播行为,他使用的是propagation类的枚举值。例如:propagation.required
    2、isolation:表示隔离级别,使用isolation类的枚举值,表示隔离级别
    3、readOnly:boolean类型的值,表示数据库操作是不只读的,默认是false。
    4、timeout:事务的超时时间,默认-1,整数值,单位是秒。例如timeout=20
    5、rollbackFor:回滚的异常类列表,他的值是一个数组,每个值是异常类的class。
    6、rollbackForClassName:表示回滚的异常类列表,他的值是异常类名称,是String类型的值
    7、noRollbackFor:指定不需要回滚的异常类,是class类型的
    8、noRollBackForClassName:不需要回滚的异常类列表,是String类型的
  • 位置
    1、在业务方法的上面,是在public方法的上面
    2、在类的方法
  • 注解的使用步骤
    1、在spring的配置文件中,声明事务的内容
      A、声明事务管理器,说明使用哪个事务管理器对象
      B、声明使用注解管理事务(开启事务注解驱动)
    2、在类的源代码中,加入@Transactional
    事务的控制模式:
    1、编程式,在代码中编程控制事务
    2、声明式事务,不用编码
    @Transactional 使用的特点:
    1、spring框架自己提供的事务控制
    2、适合中小型项目
    3、使用方便效率高

5.6 使用AspectJ框架

使用aspectj的aop,声明食物控制叫做声明式事务
使用步骤:
1、在pom文件中加入spring-aspects的依赖
2、在spring的配置文件中声明事务的内容
A、声明事务管理器
B、声明业务方法需要的事务属性
C、声明切入点表达式
声明式事务的优缺点
1、缺点:理解难,配置复杂
2、优点:代码和事务是分开配置的,控制事务源代码不需要修改
     能快速了解和掌控项目的全部事务,适合大型项目。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容