尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

笔记-数据库事务和java事务和切面

笔记-数据库事务和java事务和切面 1. 先分三个层级从上到下第一层数据库本身的事务MySQL 事务这是底层原生的和 Java、Spring 一毛钱关系都没有。MySQL 自己就有事务begin;→ 开启insert/update/deletecommit;→ 提交rollback;→ 回滚特点数据库自己管提交、回滚开启事务后不提交、不回滚连接就一直被占用持有行锁、表锁一条 SQL 执行完默认自动提交autocommiton你可以理解为仓库本身自带的锁机制。第二层Java 程序里的事务Java 只是调用数据库Java 本身没有事务Java 只是通过 JDBC 告诉 MySQL你给我开事务执行 SQL最后统一提交 / 统一回滚JDBC 事务本质就是控制数据库事务的开关// JDBC原生伪代码connection.setAutoCommit(false);// 关闭自动提交 开启事务// 执行一堆sqlconnection.commit();// 全部成功才提交connection.rollback();// 任意失败全部回滚所以Java 没有事务Java 只是操控数据库事务第三层Spring AOP 切面事务Transactional这就是你天天用的也是最绕的一层。Spring 做了一件事用 AOP 动态代理 切面自动帮你管理 JDBC 事务流程是你在方法上加TransactionalSpring 的事务切面拦截这个方法方法执行前自动开启数据库事务关闭 autoCommit执行你写的业务代码循环、mapper、接口调用方法全部正常结束自动 commit 提交方法抛异常自动 rollback 回滚一句话总结Transactional 就是 Spring AOP 切面切面 拦截器自动帮你开关数据库事务。2. 三者完整关系链核心图Spring AOP事务切面 ↓ 控制 Java JDBC 事务 ↓ 操控 MySQL 数据库原生事务数据库事务底层能力Java JDBC中间桥梁发指令给数据库Spring AOP 切面自动帮你套事务不用手写开关2.1 Transactional 的传播行为传播行为含义核心一句话REQUIRED默认如果外层有事务就加入当前事务没有则新建事务有就共用没有就新建SUPPORTS外层有事务就加入没有事务就无事务执行有就用没有就裸跑MANDATORY外层必须存在事务没有直接抛异常必须外层有事务否则报错REQUIRES_NEW挂起外层事务创建全新独立事务内外事务互不影响挂起旧的开全新事务NOT_SUPPORTED挂起外层事务以无事务运行执行完恢复外层事务挂起旧事务强制裸跑NEVER绝对不允许外层存在事务外层有事务直接抛出异常有事务直接报错NESTED外层有事务则在当前事务内创建保存点 (savepoint)外层无事务则新建事务嵌套事务支持局部回滚3. 问题回答问题 1Java 有事务吗**没有。**Java 只是操控数据库事务。问题 2Transactional 是什么Spring AOP 切面。专门用来自动管理数据库事务的切面。问题 3切面和事务是什么关系切面 事务的管理者不加注解 → 切面不理你加默认注解 → 切面全程托管事务加NOT_SUPPORTED→ 切面完全不管放开你问题 4为什么定时任务一定要 NOT_SUPPORTED定时任务特点长循环大量数据库操作调用外部接口、流程引擎慢 IO不需要多 SQL 统一回滚完全不需要统一事务所以直接关掉切面托管。问题 5程序运行数据库是不是会停止**完全不是**数据库一直正常运行。只是不加注解时连接被切面开启的长事务占住别人用不了。问题 6什么时候需要 Transactional 默认事务普通业务接口比如下单、扣款、入库、修改多条 SQL 必须一起成功、一起失败不能中途提交。问题 7什么时候必须关掉事务NOT_SUPPORTED定时任务异步任务后台批处理循环大量操作方法内包含网络调用、第三方接口不需要统一回滚的场景4. 背诵口诀事务本身是数据库的Java 没有事务Transactional 是 Spring AOP 切面自动管数据库事务默认切面方法全程一个大事务跑完才提交NOT_SUPPORTED取消切面管理无事务每条 SQL 自动提交定时任务必须关闭切面
返回列表