Transaction使用及原理
@Transaction使用及原理
1.使用介绍
@Transactional注解,属于声明式事务管理,声明式事务管理是建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。
2. Spring事务的基本原理
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。
编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。
声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。注释配置是目前流行的使用方式,因此本文将着重介绍基于@Transactional 注解的事务管理。
使用@Transactional的相比传统的我们需要手动开启事务,然后提交事务来说。它提供如下方便
根据你的配置,设置是否自动开启事务
自动提交事务或者遇到异常自动回滚
声明式事务(@Transactional)基本原理如下:
- 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。
- spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。
- 真正的数据库层的事务提交和回滚是通过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使用及原理相关推荐
- 重拾-Spring Transaction
问题 面试中是不是有时经常会被问到 "Spring 事务如何管理的了解吗?" ,"Spring 事务的传播性有哪些,能聊聊它们的使用场景吗?", "事 ...
- 面试刷题29:mysql事务隔离实现原理?
mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务. 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败.是为了保证高并发场景下数据的正确性 ...
- MySQL自增字段并发插入导致死锁
MySQL带自增字段的表在并发插入时发生死锁 问题 'int' object has no attribute 'encode'", <class 'mysql.connector.e ...
- 【Spring框架】全集详解
文章目录 ClassPathXmlApplicationContext工作原理 01.IOC:控制反转 02.什么是bean 03.DI注入以及c.p命名空间 ```p命名空间.c命名空间``` `` ...
- 零知识证明学习笔记:背景与起源
副标题:斯坦福学霸的零知识证明学习笔记(一) 本文作者东泽,来自安比技术社区的小伙伴,目前就读于斯坦福大学,研究方向密码学,本系列文章来源于作者在斯坦福著名的课程<CS 251: Cryptoc ...
- hive3.0 学习笔记~ 知识点(一)
hivesql DDL hive完整语法树 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [DB_NAME].table_name [(col ...
- @transaction 提交事务_Kafka 事务实现原理
Kafka 事务实现原理 Kafka 事务在流处理中应用很广泛,比如原子性的读取消息,立即处理和发送,如果中途出现错误,支持回滚操作.这篇文章来讲讲事务是如何实现的,首先来看看事务流程图. 事务流程 ...
- oracle exp consistent,exp CONSISTENT=Y 原理:export前发出SET TRANSACTION READ ONLY命令
今天才知道, exp CONSISTENT=Y 之所以能保持数据一致性,原来是在export前发出SET TRANSACTION READ ONLY命令,用来保持数据在同一个时间点. metalink ...
- java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...
- Zookeeper ZAB协议原理浅析
文章目录 前言 1. 基本角色和概念 2. Leader Election 3. Discovery 4. Synchronization 5. BroadCast 后记 前言 DTCC 要在下周一到 ...
最新文章
- wowpve服务器优势,PVE服务器法师对本职业的一点看法
- Union和Union All的区别
- Extjs--FormPanel(2)
- python字符串解释_Python学习:字符串的简单解释,深入浅出
- Redox随笔(1)-用Rust语言编写的类UNIX操作系统
- 彩信手机报受代表好评
- CentOS下为Web网站性能做测试
- oc引导win方法_[OC更新]机械革命8代、9代标压稳定版更新
- 计算机磁盘分为硬盘和什么,fat32是什么?
- 用例子理解java7内存结构
- python往redis导数_Python:教你一招,将500W+的数据快速写入redis(文内赋赠教程)...
- win10删除开机密码_讲解win10忘记开机密码
- Contki 相关链接备忘
- 形式语义学-JLU-ZHH
- MySQL MVCC(多版本并发控制)
- 电气CAD批量打印为PDF笔记
- week15(字符串集合:Hash、字典树、KMP)
- html批量替换不同关键词,JS批量替换内容中关键词为超链接
- 机器学习实战-预测数值型数据:回归
- 实测:华为鸿蒙系统比 Android 系统快 60%!
热门文章
- 说唱天王 Eminem 自传《The Way I am》3
- Java人脸识别考勤系统_GitHub - magician1128/WorkAttendanceSystem: 一个基于opencv、dilb的员工人脸识别考勤系统...
- CPU中控制器的功能
- 【操作系统】TCP流式传输、UDP数据报传输
- 魅族16Xs发布时间或今日公布:后置4800万像素竖排三摄
- html网页如何添加google广告,三步将谷歌广告代码添加到WordPress网站侧边栏 | 老豆国外联盟营销教程指南...
- 为什麽CMOS电路的输入端不准悬空,而TTL电路的输入端不准串接大电阻?
- Android模拟点击
- C#维特智能蓝牙5.0加速度陀螺仪角度姿态传感器协议解析
- linux 拼音输出繁体_解决rime仓颉拼音反查为繁体的问题