事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。
业务场景eg:
- public void savePosts(PostsParam postsParam) {
- // 保存文章
- save(posts);
- // 处理标签
- insertOrUpdateTag(postsParam, posts);
- }
Spring 支持两种事务方式,分别是编程式事务和声明式事务,后者最常见,通常情况下只需要一个 @Transactional
就搞定了(代码侵入性降到了最低),如下:
- @Transactional
- public void savePosts(PostsParam postsParam) {
- // 保存文章
- save(posts);
- // 处理标签
- insertOrUpdateTag(postsParam, posts);
- }
(编程式事务是指将事务管理代码嵌入嵌入到业务代码中,来控制事务的提交和回滚。),比如说,使用 TransactionTemplate 来管理事务:
- @Autowired
- private TransactionTemplate transactionTemplate;
- public void testTransaction() {
-
- transactionTemplate.execute(new TransactionCallbackWithoutResult() {
- @Override
- protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
-
- try {
-
- // .... 业务代码
- } catch (Exception e){
- //回滚
- transactionStatus.setRollbackOnly();
- }
-
- }
- });
- }
在编程式事务中,必须在每个业务操作中包含额外的事务管理代码,就导致代码看起来非常的臃肿,但对理解 Spring 的事务管理模型非常有帮助。
声明式事务将事务管理代码从业务方法中抽离了出来,以声明式的方式来实现事务管理,对于开发者来说,声明式事务显然比编程式事务更易用、更好用。
当然了,要想实现事务管理和业务代码的抽离,就必须得用到 Spring 当中最关键最核心的技术之一:AOP,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。
编程式事务比声明式事务控制的颗粒度更细。
声明式事务有许多属性,例如事物的传播行为、隔离级别、超时时间等等都支持自定义@Transactional(xxxxxxxxxx)
前面的Spring中既支持编程式事务,也支持声明式事务(@Transactional),在springboot中,就直接用@Transactional声明式事务吧。
@Transactional的作用范围:
@Transactional注解提供了许多属性供我们自定义,但大多数情况下用默认的就好了。
先说作用:
再说区别:
过滤器是在请求进入容器后,但是还没有进入Servlet之前工作的。
拦截器是在请求进入控制器(Controller) 之前进行工作的。过滤器可以有很多个,一个个过滤器组合起来就成了 FilterChain,也就是过滤器链。例如登录校验可以通过Interceptor来实现。
监听器用于监听 Web 应用中某些对象的创建、销毁、增加、修改、删除等动作,然后做出相应的处理的。
@Configuration用于取代xml作为配置文件的作用。
过滤器和拦截器都是AOP思想的实现。
redis支持的数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)