作者:黄青石
来源:cnblogs.com/huangqingshi/p/10165409.html
在写入数据库的时候需要有锁,比如同时写入数据库的时候会出现丢数据,那么就需要锁机制 。
数据锁分为乐观锁和悲观锁
它们使用的场景如下:
乐观锁适用于写少读多的情景,因为这种乐观锁相当于JAVA的CAS,所以多条数据同时过来的时候,不用等待,可以立即进行返回 。
悲观锁适用于写多读少的情景,这种情况也相当于JAVA的
synchronized
,reentrantLock等,大量数据过来的时候,只有一条数据可以被写入,其他的数据需要等待 。执行完成后下一条数据可以继续 。
他们实现的方式上有所不同 。
乐观锁采用版本号的方式,即当前版本号如果对应上了就可以写入数据,如果判断当前版本号不一致,那么就不会更新成功,比如
update table set column = value
where version=${version} and otherKey = ${otherKey}
悲观锁实现的机制一般是在执行更新语句的时候采用for update方式,比如
update table set column='value' for update
这种情况where条件呢一定要涉及到数据库对应的索引字段,这样才会是行级锁,否则会是表锁,这样执行速度会变慢 。
下面我就弄一个spring boot(springboot 2.1.1 + MySQL +
lombok
+ aop + jpa)工程,然后逐渐的实现乐观锁和悲观锁 。
并发控制--悲观锁和乐观锁详解
。
假设有一个场景,有一个catalog商品目录表,然后还有一个browse浏览表,假如一个商品被浏览了,那么就需要记录下浏览的user是谁,并且记录访问的总数 。
表的结构非常简单:
create table catalog (
id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(50) NOT NULL DEFAULT '' COMMENT '商品名称',
browse_count int(11) NOT NULL DEFAULT 0 COMMENT '浏览数',
version int(11) NOT NULL DEFAULT 0 COMMENT '乐观锁,版本号',
PRIMARY KEY(id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE table browse (
id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
cata_id int(11) NOT NULL COMMENT '商品ID',
user varchar(50) NOT NULL DEFAULT '' COMMENT '',
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY(id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
POM.XML的依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hqs</groupId>
<artifactId>dblock</artifactId>
<version>1.0-SNAPSHOT</version>
<name>dblock</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
推荐阅读
- 企业常见5大网络安全问题
- 防御DDoS攻击需要双向解决方案
- Redis 这么火,它都解决了哪些问题?
- 双网卡网络时断时续解决方法
- 化妆品|美容行业九大痛苦现状,如何解决生存之道?
- 离婚前必须清楚的十大问题
- 3招解决安卓机卡慢
- 微信消息延迟不提醒?原来是这2个原因导致的,一招教你解决
- 淘宝违规被限制登录怎么办?限制登录的解决办法 淘宝被限制登录怎么办?限制登录的解决办法
- 手机已连接WiFi但无法访问互联网,是什么问题?
