佛山专业网站营销,餐厅网站模版,网站建设中栏目是什么,容县网站建设目录 Spring中事务的实现编程式事务声明式事务Transactional 作⽤范围Transactional 参数说明注意事项Transactional ⼯作原理 MySQL 事务隔离级别Spring 事务隔离级别事务传播机制 Spring中事务的实现
Spring中事务操作分为两类#xff1a; 1.编程式事务 2.声明式事务
编程… 目录 Spring中事务的实现编程式事务声明式事务Transactional 作⽤范围Transactional 参数说明注意事项Transactional ⼯作原理 MySQL 事务隔离级别Spring 事务隔离级别事务传播机制 Spring中事务的实现
Spring中事务操作分为两类 1.编程式事务 2.声明式事务
编程式事务
Spring ⼿动操作事务和上⾯ MySQL 操作事务类似它也是有 3 个重要操作步骤 1.开启事务 2.提交事务 3.回滚事务
SpringBoot 内置了两个对象DataSourceTransactionManager ⽤来获取事务开启事务、提交或回滚事务的⽽ TransactionDefinition 是事务的属性在获取事务的时候需要将 TransactionDefinition 传递进去从⽽获得⼀个事务 TransactionStatusRestControllerpublic class UserController {Resourceprivate UserService userService;// JDBC 事务管理器Resourceprivate DataSourceTransactionManager dataSourceTransactionManager;// 定义事务属性Resourceprivate TransactionDefinition transactionDefinition;RequestMapping(/sava)public Object save(User user) {// 开启事务TransactionStatus transactionStatus dataSourceTransactionManager.getTransaction(transactionDefinition);// 插⼊数据库int result userService.save(user);// 提交事务dataSourceTransactionManager.commit(transactionStatus);// // 回滚事务// dataSourceTransactionManager.rollback(transactionStatus);return result;}
}声明式事务
声明式事务的实现很简单只需要在需要的⽅法上添加 Transactional 注解就可以实现了⽆需⼿动开启事务和提交事务进⼊⽅法时⾃动开启事务⽅法执⾏完会⾃动提交事务如果中途发⽣了没有处理的异常会⾃动回滚事务接下⾥使⽤以下代码分别设置 Transactional 注解和不设置 Transactional
Transactional 作⽤范围
Transactional 可以⽤来修饰⽅法或类 1.修饰⽅法时需要注意只能应⽤到 public ⽅法上否则不⽣效。推荐此种⽤法。 2.修饰类时表明该注解对该类中所有的 public ⽅法都⽣效。
Transactional 参数说明 注意事项
Transactional 在异常被捕获的情况下不会进⾏事务⾃动回滚. 程序中发生异常但被 try-catch处理之后不自动回滚事务的解决方案 1.将异常继续跑出去(代理对象就能感知到异常也就能自动的回滚事务) 2.使用代码⼿动回滚事务在⽅法中使⽤ TransactionAspectSupport.currentTransactionStatus() 可以得到当前的事务然后设置回滚⽅法 setRollbackOnly 就可以实现回滚了
Transactional ⼯作原理 Transactional 是基于 AOP 实现的AOP ⼜是使⽤动态代理实现的。如果⽬标对象实现了接⼝默认情况下会采⽤ JDK 的动态代理如果⽬标对象没有实现了接⼝,会使⽤ CGLIB 动态代理。 Transactional 在开始执⾏业务之前通过代理先开启事务在执⾏成功之后再提交事务。如果中途遇到的异常则回滚事务。 MySQL 事务隔离级别 READ UNCOMMITTED读未提交也叫未提交读该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据⽽未提交的数据可能会发⽣回滚因此我们把该级别读取到的数据称之为脏数据把这个问题称之为脏读。 READ COMMITTED读已提交也叫提交读该隔离级别的事务能读取到已经提交事务的数据因此它不会有脏读问题。但由于在事务的执⾏中可以读取到其他事务提交的结果所以在不同时间的相同 SQL 查询中可能会得到不同的结果这种现象叫做不可重复读。 REPEATABLE READ可重复读是 MySQL 的默认事务隔离级别它能确保同⼀事务多次查询的结果⼀致。但也会有新的问题⽐如此级别的事务正在执⾏时另⼀个事务成功的插⼊了某条数据但因为它每次查询的结果都是⼀样的所以会导致查询不到这条数据⾃⼰重复插⼊时⼜失败因为唯⼀约束的原因。明明在事务中查询不到这条信息但⾃⼰就是插⼊不进去这就叫幻读 Phantom Read。 SERIALIZABLE序列化事务最⾼隔离级别它会强制事务排序使之不会发⽣冲突从⽽解决了脏读、不可重复读和幻读问题但因为执⾏效率低所以真正使⽤的场景并不多。
Spring 事务隔离级别 Isolation.DEFAULT以连接的数据库的事务隔离级别为主。 Isolation.READ_UNCOMMITTED读未提交可以读取到未提交的事务存在脏读。 Isolation.READ_COMMITTED读已提交只能读取到已经提交的事务解决了脏读存在不可重复读。 Isolation.REPEATABLE_READ可重复读解决了不可重复读但存在幻读MySQL默认级别。 Isolation.SERIALIZABLE串⾏化可以解决所有并发问题但性能太低。
事务传播机制
Spring 事务传播机制定义了多个包含了事务的⽅法相互调⽤时事务是如何在这些⽅法间进⾏传递的。
事务传播机制规定多个事务在相互调用时事务的执行行为。
Spring 事务传播机制包含以下 7 种 Propagation.REQUIRED默认的事务传播级别它表示如果当前存在事务则加⼊该事务如果当前没有事务则创建⼀个新的事务。 Propagation.SUPPORTS如果当前存在事务则加⼊该事务如果当前没有事务则以⾮事务的⽅式继续运⾏。 Propagation.MANDATORYmandatory强制性如果当前存在事务则加⼊该事务如果当前没有事务则抛出异常。 Propagation.REQUIRES_NEW表示创建⼀个新的事务如果当前存在事务则把当前事务挂起。也就是说不管外部⽅法是否开启事务Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务且开启的事务相互独⽴互不⼲扰。 Propagation.NOT_SUPPORTED以⾮事务⽅式运⾏如果当前存在事务则把当前事务挂起。 Propagation.NEVER以⾮事务⽅式运⾏如果当前存在事务则抛出异常。 Propagation.NESTED如果当前存在事务则创建⼀个事务作为当前事务的嵌套事务来运⾏如果当前没有事务则该取值等价PROPAGATION_REQUIRED。