Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

ReepSnow/seckill

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

28 Commits

Repository files navigation

###慕课网Java高并发秒杀(课程)-代码完整优化版

###修改说明: ####1.修改数据库连接池 为 Druid ####2.请修改redis.properties 配置为你自己redis 的配置 ####3.已对视频中一些错误和SQL进行优化,代码编写更优雅,更易懂

####SQL脚本

CREATE DATABASE seckill;
USE seckill;
-- todo:mysql Ver 5.7.12for Linux(x86_64)中一个表只能有一个TIMESTAMP
CREATE TABLE seckill(
`seckill_id` BIGINT NOT NUll AUTO_INCREMENT COMMENT '商品库存ID',
`name` VARCHAR(120) NOT NULL COMMENT '商品名称',
`number` int NOT NULL COMMENT '库存数量',
`start_time` TIMESTAMP NOT NULL COMMENT '秒杀开始时间',
`end_time` DATETIME NOT NULL COMMENT '秒杀结束时间',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (seckill_id),
key idx_start_time(start_time),
key idx_end_time(end_time),
key idx_create_time(create_time)
)ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒杀库存表';
-- 初始化数据
INSERT into seckill(name,number,start_time,end_time)
VALUES
('1000元秒杀iphone6',100,'2016年01月01日 00:00:00','2016年01月02日 00:00:00'),
('800元秒杀ipad',200,'2016年01月01日 00:00:00','2016年01月02日 00:00:00'),
('6600元秒杀mac book pro',300,'2016年01月01日 00:00:00','2016年01月02日 00:00:00'),
('7000元秒杀iMac',400,'2016年01月01日 00:00:00','2016年01月02日 00:00:00')
-- 秒杀成功明细表
-- 用户登录认证相关信息(简化为手机号)
CREATE TABLE success_killed(
`seckill_id` BIGINT NOT NULL COMMENT '秒杀商品ID',
`user_phone` BIGINT NOT NULL COMMENT '用户手机号',
`state` TINYINT NOT NULL DEFAULT -1 COMMENT '状态标识:-1:无效 0:成功 1:已付款 2:已发货',
`create_time` TIMESTAMP NOT NULL COMMENT '创建时间',
PRIMARY KEY(seckill_id,user_phone),/*联合主键*/
KEY idx_create_time(create_time)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='秒杀成功明细表'
SHOW CREATE TABLE seckill\G;#显示表的创建信息

-- 存储过程
DELIMITER $$ -- console ; 转换为$$
-- 定义存储过程
-- 参数:in:输入参数
-- out:输出参数
-- ROW_COUNT();返回上一条修改类型的SQL(INSERT, DELETE, UPDATE)的影响行数
-- row_count:0未修改数据,>0表示修改的行数,<0表示SQL错误或者未执行修改SQL
CREATE PROCEDURE seckill.execute_seckill
 (IN v_seckill_id BIGINT, IN v_phone BIGINT,
 IN v_kill_time TIMESTAMP, OUT r_result INT)
 BEGIN
 DECLARE insert_count INT DEFAULT 0;
 START TRANSACTION;
 INSERT IGNORE INTO success_killed (seckill_id, user_phone, state,create_time) VALUES (v_seckill_id, v_phone,0,v_kill_time);
 SELECT ROW_COUNT() INTO insert_count;
 IF (insert_count = 0) THEN
 ROLLBACK;
 SET r_result = -1;
 ELSEIF (insert_count < 0) THEN
 ROLLBACK;
 SET r_result = -2;
 ELSE
 UPDATE seckill SET number = number - 1 WHERE seckill_id = v_seckill_id AND end_time > v_kill_time AND start_time < v_kill_time AND number > 0;
 SELECT ROW_COUNT() INTO insert_count;
 IF (insert_count = 0) THEN
 ROLLBACK;
 SET r_result = 0;
 ELSEIF (insert_count < 0) THEN
 ROLLBACK;
 SET r_result = -2;
 ELSE
 COMMIT;
 SET r_result = 1;
 END IF;
 END IF;
 END;
$$
-- 存储过程定义结束
DELIMITER ;
SET @r_result = -3;
CALL execute_seckill(1003, 11111111111, now(), @r_result);
--获取结果
SELECT @r_result;

About

JavaWeb秒杀项目学习实例

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 84.2%
  • JavaScript 12.8%
  • SQLPL 3.0%

AltStyle によって変換されたページ (->オリジナル) /