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…

防火墙阻止网页连接网络连接_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;数据库中表的数据量会…

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

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

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

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

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…

dbm和mysql使用场景_mysql基本用法总结

1 下载安装官网下载&#xff1a;http://www.mysql.com/注意需要一个Oracle账号才能下载。2 启动mysql将mysql安装目录&#xff1a;设置为环境变量&#xff0c;并将&#xff1a;\bin目录加入环境变量中。启动命令行&#xff0c;输入&#xff1a;mysqld以启动mysql的守护进程。3 …

java违反唯一约束异常_Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (DSPACE.SYS_C007868)...

Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (DSPACE.SYS_C007868).............................遇到这种问题解决方法1. 使用 约束条件查找包含的表明以及 表的字段select a.constraint_name,a.constraint_type,b.column_name,b.table_namefrom…

js中的if与Java中的if_JS直接if参数的用法JS中!和!!区别

经常在JS中见一些代码直接if(参数)&#xff0c;然后参数调用的时候是将元素自己传下去。例如下面代码:functiontest1(obj){if(obj){alert($(obj).val());}else{alert("has not obj");}}我们分别点击上面的两个输入框显示如下:解释:实际上相当于java中的重载&#xff…

vs2019能写Java吗_Visual studio2019打包程序过程

要想打包visual studio中的程序我们需要用到setup用于自定义安装部署的项目方案。但是在VS2019中不见了&#xff0c;微软是有意废除安装项目的&#xff0c;合作了一个第三方的安装项目单独使用。我们可以从官网上把Visual Studio Installer 项目扩展下载下来。地址&#xff1a;…

java继承的终极奥义_java学习笔记12-继承

继承就是子类继承父类的特征和行为有时候单一划分某个类别并不能处理所有情况&#xff0c;某些类别下有明显不同的子类&#xff0c;这些子类虽然拥有类似的行为和属性&#xff0c;但是他们各自发生的这些行为的方式或者属性对某些结果的影响是不一样的&#xff0c;这就需要划分…

flink java 并行度_flink solt和并行度

简介Flink运行时主要角色有两个&#xff1a;JobManager和TaskManager&#xff0c;无论是standalone集群&#xff0c;flink on yarn都是要启动这两个角色。JobManager主要是负责接受客户端的job&#xff0c;调度job&#xff0c;协调checkpoint等。TaskManager执行具体的Task。Ta…

java 写传奇游戏吗,文字版传奇游戏

学习java中IO操作自己写的一个小文字游戏&#xff0c;写了一天半两千多行&#xff0c;有点low的&#xff0c;因为没有使用到数据库&#xff0c;所以数据存放在文本文档中&#xff0c;大部分代码都是在处理往文档中读写内容&#xff0c; 就显得有些繁琐&#xff0c;主要锻炼了自…

【Dart】P0 Win、Mac 使用与安装

Dart 使用与安装 Dart 下载安装Windows 版本MacOS版本处于境外安装 Dart 开发工具 Dart 下载安装 Windows 版本 安装网址&#xff1a; http://gekorm.com/dart-windows/ 安装后测试&#xff1a; dart --versionMacOS版本 首先安装 Homebrew&#xff1a; 终端输入&#xff…

php cachelock,巧用lock解决缓存击穿的解决方案

背景缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期)&#xff0c;这时由于并发用户特别多&#xff0c;同时读缓存没读到数据&#xff0c;又同时去数据库去取数据&#xff0c;引起数据库压力瞬间增大&#xff0c;造成过大压力。解决方案1、设置热点数据永远不过期…

mysql 目录更改 php,Linux下更改MySQL目录

MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步&#xff1a; 1、home目录下建立da更改MySQL目录MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步&#xff1a;1、home目录下建立data…