当前位置: 首页 > news >正文

南昌做网站的公司有哪些wordpress教程_博客吧

南昌做网站的公司有哪些,wordpress教程_博客吧,浙江住房和城乡建设厅网站首页,校园网站建设的参考文献本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务。 事务的相关介绍可以参考: 0、起因 在一次线上事故中,我们…

本文基于SpringBoot 2.X

事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务。

事务的相关介绍可以参考:

0、起因

在一次线上事故中,我们定位到redis的使用存在大value,超过了dubbo的最大数据量限制,于是紧急将这个大的对象value拆分成单个的string value。

为了保持数据库和redis双写一致,在对数据库进行更新,删除,插入操作时,要从redis删除指定的key。

一切都是使用redis的常规操作,但雷就埋在其中一个数据库的update方法里,这个方法上开启了事务@Transactional,导致里面的删除redis key操作也加入了事务。

上线后出现报错:

这个报错明确指出,集群模式的redis不支持事务。集群不支持事务的原因可参考此文:Is there any Redis client (Java prefered) which supports transactions on Redis cluster?

1、Spring中的事务

所有数据访问技术都有事务机制,这些技术提供了API来开启事务、提交事务完成数据操作, 或者在发生错误的时候回滚数据。

Spring采用统一的机制来处理不同的数据访问技术的事务, Spring的事务提供一个PlatformTransactionManager的接口,不同的数据访问技术使用不同的接口实现。

数据访问技术实现
JDBCDataSourceTransactionManager
JPAJPATransactionManager
HibernateHibernateTransactionManager
JDOJDOTransactionManager
分布式事务JtaTransactionManager
  • 在SpringBoot中开启事务非常简单,只需要在方法或类上使用注解@Transactional即可。
  • Spring官方文档中还要求使用@EnableTransactionManagement 开启事务,但SpringBoot通过自动配置已经帮我们做了,所以SpringBoot中不用写该注解

@Transactional注解的几个常用属性

  • propagation

事务的传播机制,主要有以下几种,默认是REQUIRED

  1. REQUIRED - 方法A调用时候没有事务新建一个事务,在方法A中调用方法B,将使用相同的事务,如果方法B发生异常需要回滚,整个事务回滚。
     

  2. REQUIRES_NEW - 方法A调用方法B时,无论是否存在事务都开启一个新事务,这样B方法异常不会导致A的数据回滚。
     

  3. NESTED - 和REQUIRES_NEW类似,但是只支持JDBC,不支持JPA或Hibernate

  4. SUPPORTS - 方法调用时有事务就用事务,没事务就不用事务

  5. NOT_SUPPORTED - 强制方法不在事务中执行,若有事务,在方法调用到结束阶段先挂起事务。

  6. NEVER - 强制不能有事务,若有事务就抛出异常

  7. MANDATORY - 强制必须有事务,如果没有事务就抛出异常

  • rollbackFor

指定哪些异常可以导致事务回滚,默认是Throwable的子类

  • noRollbackFor

执行哪些异常不可用引起事务回滚,默认是Throwable的子类

2、@Transactional事务失效的情况

  1. 只对public方法生效。默认的protected和private方法上写上@Transactional不会报错,但该方法上的事务不生效,官方原文:Method visibility and @Transactional;
  2. 默认情况(只写@Transactional不填写rollbackFor参数)下此注解会对unchecked异常进行回滚,对checked异常不回滚;
  3. 类内部未开启事务的方法调用开启事务的方法

针对3,引用丁雪丰的《Spring全家桶》视频中的解释:

Spring的声明式事务本质上是通过AOP来增强了类的功能

Spring的AOP本质上就是为类做了一个代理

看似在调用自己写的类,实际用的是增强后的代理类

下图描述了方法被事务代理时的流程,来源:Spring AOP
 

3、SpringBoot整合Redis事务实践

下面我们搭建一个最简单的SpringBoot整合redis的工程用代码来验证redis事务

  • SpringBoot整合Redis

SpringBoot整合redis使用的是spring-boot-starter-data-redis,redis事务依赖于jdbc的事务管理,所以还需要引入jdbc

pom相关引入:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope>
</dependency>
  • 开启Redis事务

编写redis配置类,开启redis事务,配置事务管理

@Configuration
public class RedisConfig {@Beanpublic StringRedisTemplate StringRedisTemplate(RedisConnectionFactory factory) {StringRedisTemplate template = new StringRedisTemplate(factory);/*** description 开启redis事务(仅支持单机,不支持cluster)**/template.setEnableTransactionSupport(true);return template;}/*** description 配置事务管理器**/@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource){return new DataSourceTransactionManager(dataSource);}
}
  • 代码验证

针对本文讨论,设计了四个验证方法,可自行验证

/*** description 不带事务set* return java.lang.String* author 郑晓龙* createTime 2019/12/12 16:36**/
@GetMapping("put")
public void put(String key, String value) {redisService.put(key, value);
}
/*** description 带事务set* return java.lang.String* author 郑晓龙* createTime 2019/12/12 16:36**/
@GetMapping("putWithTx")
public void putWithTx(String key, String value) {redisService.putWithTx(key, value);
}
/*** description 调用带事务方法不生效的情况* return java.lang.String* author 郑晓龙* createTime 2019/12/12 16:36**/
@GetMapping("invokeWithPutTx")
public void invokeWithPutTx(String key, String value) {redisService.invokePutWithTx(key, value);
}
/*** description 调用带事务方法生效的情况* return java.lang.String* author 郑晓龙* createTime 2019/12/12 16:36**/
@GetMapping("invokeWithPutTx2")
public void invokeWithPutTx2(String key, String value) {redisService.invokePutWithTx2(key, value);
}

4、总结:

  • redis事务只支持单机,不支持cluster
  • 需要开启事务时,只需要在对应的方法或类上使用@Transactional注解即可,SpringBoot自动开启了@EnableTransactionManagement
  • 需要注意事务不生效的几种情况
  • redis事务依赖于jdbc的事务管理

5、示例代码及参考:

示例代码: redis-transaction

  1. Transaction Management
  2. Transaction Propagation
  3. Transactional Support
  4. 《Spring全家桶》丁雪丰
http://www.yayakq.cn/news/213645/

相关文章:

  • 做网站那个php好用wordpress做的学校网站
  • 深圳网站建设公司多吗网站开发什么技术
  • 杭州网站制排名好的移动网站建设
  • 网站一键收录百度网站禁止访问怎么解除
  • 怎样做网站域名哪些网站可以做推广
  • 网站模块功能怎样免费做网站视频讲解
  • 蚌埠网站制作哪家好网赢天下深圳网站建设
  • 网站的flashwordpress多站点互相链接
  • 余姚公司建设网站建筑信息网
  • 建设部门网站查询wordpress免费中文
  • 建设银行郑州中心支行网站搜索优化软件
  • 编程猫的网站是什么自适应网站举例
  • 如何做企业网站规划电脑做试卷的网站
  • 网站的投票 计数模块怎么做wordpress主题仿北京时间设置
  • 有人上相亲网站做传销燕窝沈阳最权威男科医院
  • 谷搜易外贸网站建设如何去推广自己的产品
  • 乡村网站建设门户网站 商城系统
  • 如何做网站做网站需要多少钱十大黑心装修公司排名
  • 网站建设免责声明价格列表 wordpress
  • 唐山做网站多少钱wordpress+自定义主页
  • 做国际网站有什么需要注意的wordpress怎样上传目录本
  • 深圳福田网站建设专业公司长沙网站建设公司联系方式
  • 惠州网站建设信息开发一套小区多少钱
  • 建设工程合同履行的原则石家庄网站建设seo优化营销
  • 网络推广员有前途吗网站域名如何影响seo
  • 获取网站物理路径微信商店怎么开通
  • 小公司做网站需要注意什么国外房产中介网站
  • 网站建设服务费的摊销期限网站的配色技巧
  • 能自己做生物实验的网站闵行装饰
  • 手机网站建设文章网站建设运营公司排行