spring boot 入门_SpringBoot入门建站全系列(二十一)Mybatis使用乐观锁与悲观锁

news/2024/5/9 16:42:36/文章来源:https://blog.csdn.net/weixin_39606177/article/details/110509844

v2-8cc086a1e5ab9d9bcad56133113ef36e_1440w.jpg?source=172ae18b

SpringBoot入门建站全系列(二十一)Mybatis使用乐观锁与悲观锁

一、概述

之前有两篇《SpringBoot入门建站全系列(三)Mybatis操作数据库》和《SpringBoot入门建站全系列(四)Mybatis使用进阶篇:动态SQL与分页》介绍了Springboot如何结合Mybatis进行数据库访问操作。这一篇介绍下springboot环境下Mybatis如何进行乐观锁、悲观锁的使用。

悲观锁和乐观锁的概念:

  • 悲观锁:就是独占锁,不管读写都上锁了。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
  • 乐观锁:不上锁,读取的时候带版本号,写入的时候带着这个版本号,如果不一致就失败,乐观锁适用于多读的应用类型,因为写多的时候会经常失败。

代码可以在Springboot组件化构建https://www.pomit.cn/java/spring/springboot.html中的MybatisLock组件中查看,并下载。

首发地址:

品茗IT-同步发布

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

二、配置

本文假设你已经引入spring-boot-starter-web。已经是个SpringBoot项目了,如果不会搭建,可以打开这篇文章看一看《SpringBoot入门建站全系列(一)项目建立》。

2.1 Maven依赖

需要引入spring-boot-starter-data-jpa,这里要访问数据库,所以要依赖数据库相关jar包。

<dependency>

2.2 配置文件

在application.properties 中需要添加下面的配置:

spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.dbcp2.max-wait-millis=60000
spring.datasource.dbcp2.min-idle=20
spring.datasource.dbcp2.initial-size=2
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.connection-properties=characterEncoding=utf8
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.test-while-idle=true
spring.datasource.dbcp2.test-on-borrow=true
spring.datasource.dbcp2.test-on-return=falsespring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=cff
spring.datasource.password=123456mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

这里面,包含了数据库连接信息、数据源的连接池配置信息、mybatis配置信息。

  • spring.datasource.dbcp2是配置dbcp2的连接池信息;
  • spring.datasource.type指明数据源的类型;
  • 最上面的http://spring.datasource.xxx指明数据库连接池信息;
  • mybatis.configuration.log-impl指明mybatis的日志打印方式

三、悲观锁

悲观锁在数据库的访问中使用,表现为:前一次请求没执行完,后面一个请求就一直在等待。

3.1 Dao层

数据库要实现悲观锁,就是将sql语句带上for update即可。 for update 是行锁

所在mybatis的查询sql加上for update,就实现了对当前记录的锁定,就实现了悲观锁。

UserInfoDao :

package 

这里,findByUserNameForUpdate的sql中加上了for update。update就是普通的更新而已。

3.2 Service层

更新数据库前,先调用findByUserNameForUpdate方法,使上面的配置的悲观锁锁定表记录,然后再更新。

UserInfoService :

package 

测试中,我们在update方法中sleep几秒,其他线程的update将一直等待。

3.3 测试Web层

可以先调用/update/{time}接口,延迟执行,然后马上调用/update接口,会发现,/update接口一直在等待/update/{time}接口执行完成。

MybatisPessLockRest :

package 

四、乐观锁

数据库访问dao层还是3.1那个UserInfoDao。

4.1 Dao层

UserInfoDao更新时,需要携带version字段进行更新:and version = #{version}。如果version不一致,是不会更新成功的,这时候,我们的select查询是不能带锁的。

UserInfoDao :

package 

4.2 Service层

service层我们做一下简单的调整。更新数据库前,先调用findByUserName方法,查询出当前的版本号,然后再更新。

UserInfoService :

package 

4.2 测试Web层

可以先调用/update/{time}接口,延迟执行,然后马上调用/update接口,会发现,/update接口不会等待/update/{time}接口执行完成,读取完版本号能够成功更新数据,但是/update/{time}接口等待足够时间以后,更新的时候会失败,因为它的版本和数据库的已经不一致了。

注意: 这里更新失败不会抛异常,但是返回值会是0,即更新不成功,需要自行判断。jpa的乐观锁可以抛出异常,手动catch到再自行处理。

MybatisOptiLockRest :

package 

五、过程中用到的完整实体和Service

UserInfo:

UserInfoService :

UserInfoDao:

详细完整的实体及代码,可以访问品茗IT-博客《SpringBoot入门建站全系列(二十一)Mybatis使用乐观锁与悲观锁》进行查看

品茗IT-博客专题:https://www.pomit.cn/lecture.html汇总了Spring专题、Springboot专题、SpringCloud专题、web基础配置专题。

快速构建项目

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot使用吧!

v2-49b2e5bf337f7ecd52a09a46bd7f4fab_b.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_769463.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

帝国网站管理系统后台e/class/config.php不存在,帝国CMS7.0使用常见问题小结

一、7.0版本的数据库配置文件是哪个文件&#xff1f;7.0版本数据库配置文件&#xff1a;/e/config/config.php6.6及以下版本数据库配置文件&#xff1a;/e/class/config.php二、忘记后台登陆认证码怎么办&#xff1f;查看 /e/config/config.php 文件里的“$ecms_config[\’esaf…

seo如何优化文章-知识交流_seo如何优化文章?

很多类型的网站&#xff0c;都不可避免的需使用文章内容来做排名&#xff0c;作为seo行业人员该如何优化文章是当前面临的&#xff0c;一直面临的问题。内容为王的说法一直不过时&#xff0c;合适的文章内容是白帽seo工作的重中之重。很多朋友坚持写原创文章&#xff0c;发现自…

c语言java中间键,《大型网站系统与Java中间件实践》-消息中间件

1. 消息系统的价值1.1没有消息系统的时候假设你负责系统的用户注册模块开发&#xff0c;突然有一天接到产品的要求让你增加注册成功之后发短信任务&#xff0c;此时你屁颠屁颠的找到用户注册部分的代码&#xff0c;然后你快速的在代码后面加上调用短信服务的代码&#xff0c;心…

网络连接异常、网站服务器失去响应_新型DoS攻击或对使用了CDN的网站产生巨大威胁...

在当今全球网络中&#xff0c;CDN服务扮演着很重要的角色&#xff0c;它的缓存系统可以极大缓解原网站的压力&#xff0c;并给访问者提供更好的网络体验。但近期&#xff0c;有安全研究人员发现了一种针对CDN缓存功能的DoS攻击——CPDoS&#xff0c;它有多种变体&#xff0c;不…

nand flash多少次写_这个比QQ空间还古老的网站,是多少网友的精神家园?

你多久没有上网冲浪了&#xff1f;你还记得第一次和因特网的亲密接触吗&#xff1f;仔细算算那些诞生于 1999 年的网站&#xff0c;已经过了二十岁了。这些网站就像一座孤岛&#xff0c;在飞速发展的网络时代&#xff0c;这么多年来一直坚守着自己 QQ 空间式文艺复兴的设计。二…

php网站建设步骤,「php环境搭建」简单6个步骤教会你快速搭建一个网站(windows环境) - seo实验室...

php环境搭建三、配置php环境1、同样php模块选择也是免安装版&#xff0c;直接解压到自己习惯的文件夹中配置即可&#xff0c;提醒站长在官网上下载的时候也要注意系统和VC环境支持。解压路径如下图&#xff1a;进入php的解压目录&#xff0c;找到php.ini-production或者php.ini…

二次元论坛php,Discuz动漫二次元风格网站模板商业版

模板简介Discuz动漫二次元风格网站模板商业版&#xff0c;GBK商业版。1、本模板为门户论坛个人空间形式&#xff0c;其中个人空间模板需要单独购买&#xff0c;点击购买&#xff0c;美化N多默认模板页面2、全新设计的标签页&#xff0c;标签页帖子图文调用3、论坛首页&#xff…

Linux 网站部署——如何部署自己的论坛网站(简单易上手)

首先我们需要部署自己的网站需要的几个工具及服务&#xff1a; 1.云服务器 阿里云、华为云、腾讯云都可以&#xff0c;记下自己的IP地址&#xff1b; 2.X-shell工具&#xff1b; 3.代码包&#xff08;在这里我们以部署一个开源的BBS网站为例子&#xff09;。 首先&#xff0c…

Linux网站部署——从零到一部署一个自己的电商网站

上一篇关于部署论坛的网站已经发出&#xff0c;这次我们来部署一下电商网站&#xff0c;前期的准备工作请参考上篇文章&#xff1a;https://editor.csdn.net/md/?articleId114901490 我在这里直接借用了一个云服务器。如果还是自己服务器的同学可以直接使用我们的第一条命令&…

Linux网站服务——静态站点动态站点

网站服务 概念&#xff1a; 网站(Website)是指在因特网上根据一定的规则&#xff0c;使用HTML&#xff08;标准通用标记语言&#xff09;等工具制作的用于展示特定内容相关网页的集合。简单地说&#xff0c;网站是一种工具&#xff0c;人们可以通过网站来提供相关的网络服务。…

Linux部署网站域名服务——DNS网站搭建域名购买

概念 域名服务作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。 hosts文件&#xff08;互联网发展初期的服务&#xff09; windows系统 C:\Windows\System32\drivers\etc\host…

Linux HTTP网站——网站基础服务详解

HTTP HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;超文本传输协议&#xff0c;用于万维网WWW.&#xff08;World Wide Web&#xff09;与浏览器的传输协议。&#xff08;基于TCP/IP通信协议&#xff09; HTTP工作原理 http协议工作于客户端、服务端架构上&#…

Linux NginxHTTPS——HTTPS介绍、加密算法、SSL协议、HTTP风险、Nginx HTTPS部署(安全的网站部署)

HTTPS介绍 HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;Google 为了保证数据安全很早就开始启用了。 近些年互联网巨头&#xff0c;开始大力推行 HTTPS&#xff0c; 国内外的大型互联网公司基本也都已经启用了全站 HTTPS。…

一章——Web网站服务(一)(应用—linux高级管理)

三期总目录链接 目录 1、Apache 的起源 2、准备工作centOS7机器一台 3、把httpd添加为系统服务 4、httpd服务和 dns服务结合使用 域名访问网站 就www.aaa.com为例 常用的全局配置参数 常用的全局配置参数&#xff08;续&#xff09; Require配置项的常见语法 1、Apach…

二章——Web 网站服务(二)(应用——linux高级管理)

三期总目录链接 目录 一、基本理论 &#xff08;一&#xff09;、客户机地址限制 &#xff08;二&#xff09;、用户授权限制 二、实验要求 1、默认情况 2、只允许客户端192.168.1.200访问网站应该如何修改配置文件并验证 3、进行用户授权配置&#xff0c;允许aaa 和bo…

二章——Web网站服务(二)2.2(应用——linux高级管理)

三期总目录链接 目录 一、构建虚拟Web主机 案例1&#xff1a; 构建www.a1.com 和www.a1.com 这种基于域名的虚拟主机 案例2&#xff1a;构建基于地址的虚拟主机 &#xff08;192.168.1.2 和 192.168.1.12&#xff09; 案例3&#xff1a; 添加基于端口的虚拟主机 &#xf…

四章——Nginx网站服务(应用——linux防护与群集)

三期总目录链接 目录 一、Nginx服务 1、安装及运行控制 2、配置文件nginx.conf 2.1全局配置 解释&#xff1a; 2.2 I/O事件配置 解释&#xff1a; 2.3 HTTP配置 解释&#xff1a; 3、访问状态统计及虚拟主机应用 二、LNMP架构及应用部署 1、搭建LNMP网站平台 1.1…

rust全息要啥才能做_网站优化要怎么做才能排名靠前-乐云SEO

对于一个网站来说&#xff0c;网站优化是重要的&#xff0c;只有在搜索引擎中的关键词排名靠前才能获得更多的点击量。一个没有用户点击量的网站&#xff0c;即使它是完美的&#xff0c;是徒劳的。那么&#xff0c;我们如何在百度或其他搜索引擎的主页上获得网站的关键词排名呢…

实验楼网站mysql_进阶篇 - MySQL 常用查询

实验9 进阶篇-MySQL常用查询一、简介1. 内容&#xff1a;通过一个经销商数据库实例学习并实践多种在数据库中查找记录的方法。2. 知识点&#xff1a;表查询操作。二、步骤1. 启动并连接MySQL。创建切换数据库。创建表并插入数据。mysql> CREATE TABLE shop (-> article I…

java 爬虫 登陆_Java 爬虫遇到需要登录的网站,该怎么办?

这是 Java 网络爬虫系列博文的第二篇&#xff0c;在上一篇 Java 网络爬虫&#xff0c;就是这么的简单 中&#xff0c;我们简单的学习了一下如何利用 Java 进行网络爬虫。在这一篇中我们将简单的聊一聊在网络爬虫时&#xff0c;遇到需要登录的网站&#xff0c;我们该怎么办&…