营销型网站的建设要求都有什么,门户网站意思,网站百度搜不到,WordPress结婚主题模板事务 Springboot有3种技术方式来实现让加了Transactional的方法能使用数据库事务#xff0c;分别是动态代理(运行时织入)、“编译期织入”和“类加载期织入”。这3种技术都是基于AOP(Aspect Oriented Programming#xff0c;面向切面编程)思想。#xff08;在网…事务 Springboot有3种技术方式来实现让加了Transactional的方法能使用数据库事务分别是动态代理(运行时织入)、“编译期织入”和“类加载期织入”。这3种技术都是基于AOP(Aspect Oriented Programming面向切面编程)思想。在网上看了很多文章大家伙儿都把AOP称之为一种技术其实不然AOP并不特指一种技术而是一种编程范式基于AOP编程范式不同的编程语言都有自己的实现。 在开发中尤其要针对多表操作的时候要注意事物的原子性举个例子 在转账模块A向B转账100元表设计为A与B为同一个表但是A转账之后要将A的金额-100B的金额100。 这时候如果不考虑原子性的话那么更新A的数据成功了而更新B表失败了就会导致A的钱已经少了B却没有收到这是绝对不允许的因此需要需要保证「转账」的原子性「要么一起成功要么一起失败」。使用Transactional注解就是专门做这个的。
Transaction 方式(基于动态代理支持)
依赖 dependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversionversion/version!-- 5.2.7.RELEASE --
/dependency注解 在启动类上加上EnableTransactionManagement注解
SpringBootApplication
EnableTransactionManagement
public class TransactionApplication {public static void main(String[] args) {SpringApplication.run(TransactionApplication.class, args);}
}在需要使用到事务的地方加上Transactional注解 TransactionalGetMapping(insertExceptionT)public void insert3(){User u1 new User();u1.setUsername(王五);u1.setPassword(123);userMapper.insert(u1);throw new RuntimeException(测试);}测试
在测试代码中我们尝试向User表中插入User分别创建两个接口一个使用Transactional注解一个不使用并且在两个接口运行的时候都抛出RuntimeException查看是否会成功。
GetMapping(insertException)public void insert2(){User u1 new User();u1.setUsername(李四);u1.setPassword(123);userMapper.insert(u1);throw new RuntimeException(测试);}TransactionalGetMapping(insertExceptionT)public void insert3(){User u1 new User();u1.setUsername(王五);u1.setPassword(123);userMapper.insert(u1);throw new RuntimeException(测试);}分别访问两个低之后查看MySQL数据情况
------------------------
| id | username | password |
------------------------
| 10 | 李四 | 123 |
------------------------可以发现没有加Transactional注解的方法虽然报错了但是数据依旧插入成功但是加了注解的方法什么数据都没有插入。
Transactional 失效场景
如果Transaction标注的是一个私有方法的话那么可能会导致IDEA测试的时候事务失效具体的查看下面这篇文章吧等有时间的时候再补充一下。 参考文章「掘金」SpringBoot事务使用及注意事项