mysql悲观锁关键字_MySQL悲观锁 select for update实现秒杀案例(jfinal框架)

MySQL悲观锁 select for update实现秒杀案例(jfinal框架)

发布时间:2018-08-17作者:laosun阅读(4287)

0f9e8264915948f7a1174b4a48c40c63.gif

为了方便测试,博主使用最新的jfinal框架,里边的东西就修改了一下a_little_config.txt,配置数据库链接的,启动直接打开DemoConfig.java,main方法启动即可(记得修改端口),这样就不用再去写jdbc了。感兴趣的朋友可以去了解一下:

主要源码(模拟120人同时抢购100件商品):package com.demo.index;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.jfinal.core.Controller;

import com.jfinal.plugin.activerecord.Db;

/**

* 秒杀/MySQL 悲观锁实现方式

*

* @author sun

*/

public class SecKillForPLController extends Controller {

public static int goodsTotalNum = 100;

public void index() {

//每一次新的请求都会模拟抢购100件商品,所以先恢复商品的数量,这个可以不要,也可以手动去更新数据库

Db.update("update t_goods set num = ? where id = 1", goodsTotalNum);

SecKillPL sk = new SecKillPL();

// 模拟120个人抢购

for (int i = 1; i <= 120; i++) {

new Thread(sk, i + " 号人").start();

}

renderHtml("

抢购成功!

");

}

}

/**

* 这里我们只是演示数据库悲观锁的实现方式,至于事务等其他的都不添加了。

*

* @author sun

*/

class SecKillPL implements Runnable {

@Override

public void run() {

Connection conn = null;

PreparedStatement ps = null;

try {

conn = Db.use().getConfig().getConnection();

conn.setAutoCommit(false);

ps = conn.prepareStatement("select * from t_goods where id = 1 for update");

ResultSet rs = ps.executeQuery();

Integer num = 0;

while (rs.next()) {

num = rs.getInt("num");

}

if (num > 0) {

PreparedStatement ps2 = conn.prepareStatement("update t_goods set num=num-1 where id = 1");

ps2.execute();

System.out.println(Thread.currentThread().getName() + " 抢到了第" + (SecKillForPLController.goodsTotalNum - num + 1) + "商品");

conn.commit();

}else{

System.err.println(Thread.currentThread().getName() + " 太悲剧了,没抢到商品...");

}

} catch (SQLException e1) {

e1.printStackTrace();

} finally {

try {

ps.close();

} catch (SQLException e) {}

try {

conn.close();

} catch (SQLException e) {}

}

}

}

代码里有些jfinal的东西,看不懂的不要紧,只要知道是操作sql就行。

输出结果:

3 号人 抢到了第1商品

2 号人 抢到了第2商品

1 号人 抢到了第3商品

4 号人 抢到了第4商品

9 号人 抢到了第5商品

6 号人 抢到了第6商品

5 号人 抢到了第7商品

......

95 号人 抢到了第92商品

94 号人 抢到了第93商品

97 号人 抢到了第94商品

98 号人 抢到了第95商品

99 号人 抢到了第96商品

100 号人 抢到了第97商品

80 号人 抢到了第98商品

83 号人 抢到了第99商品

102 号人 抢到了第100商品

96 号人 太悲剧了,没抢到商品...

101 号人 太悲剧了,没抢到商品...

103 号人 太悲剧了,没抢到商品...

104 号人 太悲剧了,没抢到商品...

105 号人 太悲剧了,没抢到商品...

106 号人 太悲剧了,没抢到商品...

107 号人 太悲剧了,没抢到商品...

108 号人 太悲剧了,没抢到商品...

109 号人 太悲剧了,没抢到商品...

110 号人 太悲剧了,没抢到商品...

111 号人 太悲剧了,没抢到商品...

112 号人 太悲剧了,没抢到商品...

113 号人 太悲剧了,没抢到商品...

114 号人 太悲剧了,没抢到商品...

115 号人 太悲剧了,没抢到商品...

116 号人 太悲剧了,没抢到商品...

117 号人 太悲剧了,没抢到商品...

118 号人 太悲剧了,没抢到商品...

119 号人 太悲剧了,没抢到商品...

120 号人 太悲剧了,没抢到商品...

t_goods表结构:

CREATE TABLE `d_sunjs_test`.`t_goods`  (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

`num` int(11) NULL DEFAULT NULL,

PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

下一篇文章: 用MySQL乐观锁来实现秒杀

af499b9437efec8e1b25c2bb396e60d7.png

7 +1

版权声明

发表评论

请文明留言

发表

共 0 条评论

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

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

相关文章

pl sql 连接mysql_PL/SQL 连接mysql步骤

下面就将PL/SQL的配置说明一下。一、安装Oracle客户端&#xff0c;让后配置 安装目录下面的C:\ORACLE\instantclient_11_2\NETWORK\ADMIN 的 tnsnames.ora文件&#xff0c;如下&#xff1a;修改成自己的配置名 (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 服务器IP)(PORT…

mysql 创建表时提示错误代码_MySQL创建表时遇到的错误

学习MySQL第一个程序就遇到了bug。创建表时需注意的事项加以总结&#xff1a; 1、先创建数据库&#xff1a; create database 数据库名&#xff1b;然后连接要用的数据库 use 数据库名&#xff1b;下面就可以执行建表语句 了。2、错误提示&#xff1a;ERROR 1064 (4…

根据工序画出aoe网_这些金刚网纱窗竟然含“毒”!选错就得病

窗户进行装修我们通常会安装纱窗&#xff0c;这样可以阻止一些蚊虫或者灰尘进入家里。金刚网纱窗是业主们常常挑选的一种纱窗。不过最近听别人说金刚网纱窗是含毒的&#xff0c;这不禁让安装这种纱窗的业主感到吃惊&#xff0c;而这消息是真是假呢我们看看专家的说法&#xff0…

7 centos 时钟跟物理机同步_centos7上使用chrony自动同步时间

在linux中&#xff0c;有些服务必须依靠准确的时间&#xff0c;才能够在运行的时候不出差错&#xff0c;例如DNS&#xff0c;LVS&#xff0c;HTTPS等&#xff0c;都需要后台的服务器之间保持时间的同步。而Centos系统中自带的有安装对应的同步时间的服务。centos7中默认安装的是…

mysql key_mysql 索引 key 的用法

mysql 索引 key 的用法mysql> desc aa;-------------------------------------------| Field | Type | Null | Key | Default | Extra |-------------------------------------------| id | int(11) | YES | | NULL | |-------------------------------…

防火墙阻止网页连接网络连接_win7电脑打不开网页怎么办 win7电脑打不开网页解决步骤【图文步骤】...

我们在使用电脑的过程当中&#xff0c;经常都会浏览一些网页&#xff0c;不过最近有位win7系统用户在使用电脑浏览网页的时候却遇到了网页打不开网页的问题&#xff0c;这导致了很多事情都无法操作&#xff0c;其实网页打不开的问题&#xff0c;一般都跟网络有关&#xff0c;那…

mysql mysqldumpslow_慢日志分析工具—mysqldumpslow 和 mysqlsla

前提&#xff1a;分析mysql性能的时候会查看数据库的哪些sql语句有问题&#xff0c;效率低。这就用到了数据库的慢查询&#xff0c;作用就是&#xff1a; 它能记录下所有执行超过long_query_time时间的SQL语句&#xff0c;帮你找到执行慢的SQL&#xff0c;方便我们对这些SQL进行…

mysql分库分表面试_【53期】面试官:谈一下数据库分库分表之后,你是如何解决事务问题?...

点击上方“Java面试题精选”&#xff0c;关注公众号面试刷图&#xff0c;查缺补漏>>号外&#xff1a;往期面试题&#xff0c;10篇为一个单位归置到本公众号菜单栏->面试题&#xff0c;有需要的欢迎翻阅。一、概述随着时间和业务的发展&#xff0c;数据库中表的数据量会…

pandas python groupby_python – 如何使用pandas groupby汇总多个列?

我有一个看起来像的数据框day type col d_1 d_2 d_3 d_4 d_5...1 A 1 1 0 1 01 A 2 1 0 1 02 B 1 1 1 0 0也就是说,我有一个普通的列(col)和许多以d_为前缀的列我需要按日执行groupby并键入,我想计算每个日期类型组合的每个d_列中的值的总和.我还需要在我的数据中的其他列上执行…

圆管当量直径_截面相同时,正方型截面的当量直径大于圆管直径。( )。

“党在过渡时期的总路线的实质&#xff0c;截面就是使生产资料的社会主义公有制成为我们国家和社会的( )的经济基础。”根据小儿尿道特点&#xff0c;相同型截易患的疾病为正方直径直径泌尿系感染的致病菌最为常见的是当量大于汽车离合器踏板自由行程过小或没有行程, 将会引起(…

h710阵列卡支持最大硬盘_DELL服务器RAID磁盘阵列在线扩容(以H710P阵列卡为例)

DELL服务器RAID磁盘阵列在线扩容(以H710P阵列卡为例)分享到&#xff1a;作者来源: 未知 发布时间&#xff1a;2013-01-12简介我们可通过扩充容量和 / 或改变 RAID 级别的方式来重新配置联机虚拟磁盘。注&#xff1a; 跨接式虚拟磁盘 (如 RAID 10、 50 和 60)无法重新配置…

linuxpgrepgrep_linux命令:ps pstree pgrep pidof进程管理

ps命令简介&#xff1a;此个命令用于查看用户进程。1&#xff0e;命令格式&#xff1a;ps [option] &#xff1a; ps 参数常用的使用格式&#xff1a;ps aux |grep keyword 通过关键字查找相关的进程信息[rootxuelinux ~]# ps aux 显示所有进程的信息USER PID %CPU %MEM …

bash shell sed 获取第一行_老司机给出的关于 shell 脚本的8个建议,必收!

这八个建议&#xff0c;来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条&#xff0c;后来思索再三&#xff0c;去掉几条无关痛痒的&#xff0c;最后剩下八条。毫不夸张地说&#xff0c;每条都是精挑细选的&#xff0c;虽然有几点算是老生常谈…

springmvc与mysql实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

摘要&#xff1a;本文主要讲了如何使用Maven来搭建SpringMybatisSpringMVCMySql的搭建实例&#xff0c;文章写得很详细&#xff0c;有代码有图片&#xff0c;最后也带有运行的效果。一、准备工作1. 首先创建一个表&#xff1a;CREATE TABLE t_user (USER_ID int(11) NOT NULL A…

python常规异常的基类_Python警告的基类警告类是____。

【判断题】pickle使用pickle.dump(data,file)读取数据。【单选题】下列是Python断言语句失败的错误类型是?【单选题】立体被平面截切所产生的表面交线称为( )。【判断题】在Python的异常处理中,可以人为的设置某种错误类型【单选题】单片机实质上是一个【单选题】确认密码的限…

磁力mysql搜索_多功能搜索 搜索系统安装 小说 电影 磁力

环境&#xff1a;2h4g 60ssd一、首先安装宝塔面板yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh安装环境采用 nginx php7 mysql5.5二、关闭centos下的防火墙CentOS 6.5关闭防火墙servcie iptables st…

ES迁mysql_使用kafka连接器迁移mysql数据到ElasticSearch

概述把 mysql 的数据迁移到 es 有很多方式&#xff0c;比如直接用 es 官方推荐的 logstash 工具&#xff0c;或者监听 mysql 的 binlog 进行同步&#xff0c;可以结合一些开源的工具比如阿里的 canal。这里打算详细介绍另一个也是不错的同步方案&#xff0c;这个方案基于 kafka…

mysql not exists很慢_查询速度优化用not EXISTS 代替 not in

exists : 强调的是是否返回结果集&#xff0c;不要求知道返回什么, 比如&#xff1a;select name from student where sex m and mark exists(select 1 from grade where ...) ,只要exists引导的子句有结果集返回&#xff0c;那么exists这个条件就算成立了,大家注意返回的字段…

python自定义函数func_python自定义函数与面向对象

前言python的最大特点就是dynamically typed就是动态类型&#xff0c;不像java需要定义数据类型引入先从一段代码引入&#xff1a;12345678910class Dog():def __init__(self,name,age):self.namenameself.ageagedef getName(self):return self.namedogDog(name,16)print(dog.g…

java的继承实例_java继承(实例讲解一)

Java继承(Java inheritance)Java继承是使用已存在的类的定义作为基础建立新类的技术&#xff0c;新类的定义可以增加新的数据或新的功能&#xff0c;也可以用父类的功能&#xff0c;但不能选择性地继承父类。这种技术使得复用以前的代码非常容易&#xff0c;能够大大缩短开发周…