@Transaction使用及原理

1.使用介绍

​ @Transactional注解,属于声明式事务管理,声明式事务管理是建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可

2. Spring事务的基本原理

​ 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。

​ 编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。

​ 声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。注释配置是目前流行的使用方式,因此本文将着重介绍基于@Transactional 注解的事务管理。
使用@Transactional的相比传统的我们需要手动开启事务,然后提交事务来说。它提供如下方便

  • 根据你的配置,设置是否自动开启事务

  • 自动提交事务或者遇到异常自动回滚

    ​ 声明式事务(@Transactional)基本原理如下:

  1. 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。
  2. spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。
  3. 真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
public @interface Transactional {@AliasFor("transactionManager")String value() default "";@AliasFor("value")String transactionManager() default "";Propagation propagation() default Propagation.REQUIRED;Isolation isolation() default Isolation.DEFAULT;int timeout() default -1;boolean readOnly() default false;Class<? extends Throwable>[] rollbackFor() default {};String[] rollbackForClassName() default {};Class<? extends Throwable>[] noRollbackFor() default {};String[] noRollbackForClassName() default {};
}
  • transactionManager()表示应用那个应用那个TransactionManager.常用的有如下的事务管理器

  • isolation()表示隔离级别

脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。
不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。
幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。

不可重复读的重点是修改 :同样的条件, 你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增或者删除:同样的条件, 第 1 次和第 2 次读出来的记录数不一样。

@Transactional不建议用在处理时间过长的事务。因为,它会一直持有数据库线程池的连接,造成不能及时返回。就是尽量是的事务的处理时间短。

Transaction使用及原理相关推荐

  1. 重拾-Spring Transaction

    问题 面试中是不是有时经常会被问到 "Spring 事务如何管理的了解吗?" ,"Spring 事务的传播性有哪些,能聊聊它们的使用场景吗?", "事 ...

  2. 面试刷题29:mysql事务隔离实现原理?

    mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务. 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败.是为了保证高并发场景下数据的正确性 ...

  3. MySQL自增字段并发插入导致死锁

    MySQL带自增字段的表在并发插入时发生死锁 问题 'int' object has no attribute 'encode'", <class 'mysql.connector.e ...

  4. 【Spring框架】全集详解

    文章目录 ClassPathXmlApplicationContext工作原理 01.IOC:控制反转 02.什么是bean 03.DI注入以及c.p命名空间 ```p命名空间.c命名空间``` `` ...

  5. 零知识证明学习笔记:背景与起源

    副标题:斯坦福学霸的零知识证明学习笔记(一) 本文作者东泽,来自安比技术社区的小伙伴,目前就读于斯坦福大学,研究方向密码学,本系列文章来源于作者在斯坦福著名的课程<CS 251: Cryptoc ...

  6. hive3.0 学习笔记~ 知识点(一)

    hivesql DDL hive完整语法树 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [DB_NAME].table_name [(col ...

  7. @transaction 提交事务_Kafka 事务实现原理

    Kafka 事务实现原理 Kafka 事务在流处理中应用很广泛,比如原子性的读取消息,立即处理和发送,如果中途出现错误,支持回滚操作.这篇文章来讲讲事务是如何实现的,首先来看看事务流程图. 事务流程 ...

  8. oracle exp consistent,exp CONSISTENT=Y 原理:export前发出SET TRANSACTION READ ONLY命令

    今天才知道, exp CONSISTENT=Y 之所以能保持数据一致性,原来是在export前发出SET TRANSACTION READ ONLY命令,用来保持数据在同一个时间点. metalink ...

  9. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  10. Zookeeper ZAB协议原理浅析

    文章目录 前言 1. 基本角色和概念 2. Leader Election 3. Discovery 4. Synchronization 5. BroadCast 后记 前言 DTCC 要在下周一到 ...

最新文章

  1. wowpve服务器优势,PVE服务器法师对本职业的一点看法
  2. Union和Union All的区别
  3. Extjs--FormPanel(2)
  4. python字符串解释_Python学习:字符串的简单解释,深入浅出
  5. Redox随笔(1)-用Rust语言编写的类UNIX操作系统
  6. 彩信手机报受代表好评
  7. CentOS下为Web网站性能做测试
  8. oc引导win方法_[OC更新]机械革命8代、9代标压稳定版更新
  9. 计算机磁盘分为硬盘和什么,fat32是什么?
  10. 用例子理解java7内存结构
  11. python往redis导数_Python:教你一招,将500W+的数据快速写入redis(文内赋赠教程)...
  12. win10删除开机密码_讲解win10忘记开机密码
  13. Contki 相关链接备忘
  14. 形式语义学-JLU-ZHH
  15. MySQL MVCC(多版本并发控制)
  16. 电气CAD批量打印为PDF笔记
  17. week15(字符串集合:Hash、字典树、KMP)
  18. html批量替换不同关键词,JS批量替换内容中关键词为超链接
  19. 机器学习实战-预测数值型数据:回归
  20. 实测:华为鸿蒙系统比 Android 系统快 60%!

热门文章

  1. 说唱天王 Eminem 自传《The Way I am》3
  2. Java人脸识别考勤系统_GitHub - magician1128/WorkAttendanceSystem: 一个基于opencv、dilb的员工人脸识别考勤系统...
  3. CPU中控制器的功能
  4. 【操作系统】TCP流式传输、UDP数据报传输
  5. 魅族16Xs发布时间或今日公布:后置4800万像素竖排三摄
  6. html网页如何添加google广告,三步将谷歌广告代码添加到WordPress网站侧边栏 | 老豆国外联盟营销教程指南...
  7. 为什麽CMOS电路的输入端不准悬空,而TTL电路的输入端不准串接大电阻?
  8. Android模拟点击
  9. C#维特智能蓝牙5.0加速度陀螺仪角度姿态传感器协议解析
  10. linux 拼音输出繁体_解决rime仓颉拼音反查为繁体的问题