目录导航
-
撤销(Ctrl+Z)
-
重做(Ctrl+Y)
-
清空
-
H
标题(Ctrl+1~6)
- 一级标题
- 二级标题
- 三级标题
- 四级标题
- 五级标题
- 六级标题
-
粗体(Ctrl+B)
-
斜体(Ctrl+I)
-
删除线
-
插入引用(Ctrl+Q)
-
无序列表(Ctrl+U)
-
有序列表(Ctrl+O)
-
表格
-
插入分割线
-
插入链接(Ctrl+L)
-
插入图片
- 添加图片链接
-
插入代码块
-
保存(Ctrl+S)
-
开启预览
-
开启目录导航
-
关闭同步滚动
-
全屏(按ESC还原)
# 问题 ### 1. 并发问题 ### 2. 重复请求 # 方案 ### 1. 自减并判断库存是否存在,加锁解决重复请求问题 * 可以解决并发,不能解决重复请求 ``` update products set stock=stock-1 where id = 3 and stock >1 ``` ### 2. 对数据加锁,解决并发问题 * 使用MySQL锁机制,对库存进行加锁,防止其他人读写。 * 读多写少不推荐,性能差 ``` select * from products where id =3 for update; update products set stock=2 where id =3 ``` # 锁机制 ### 乐观锁 * 对冲突抱有乐观态度,假设一般不会出现冲突 * 在数据提交更新的时候,才会对数据的冲突进行检测,若冲突了则返回错误信息,让程序决定如何去做。 * 适用于读多写少的场景 常见做法CAS(compare and set),方案一就是乐观锁。 ### 悲观锁 * 对数据的冲突持有悲观态度。 * 具有强烈的占有和排他性,直接对数据进行加锁已防止并发。 方案二就是悲观锁 * 悲观锁生效的条件:1、innoDB,2、处于事务块中。 proxy_buffer_size 1024k; proxy_buffers 16 1024k; proxy_busy_buffers_size 2048k; proxy_temp_file_write_size 2048k;
问题
1. 并发问题
2. 重复请求
方案
1. 自减并判断库存是否存在,加锁解决重复请求问题
- 可以解决并发,不能解决重复请求
update products set stock=stock-1 where id = 3 and stock >1
2. 对数据加锁,解决并发问题
- 使用MySQL锁机制,对库存进行加锁,防止其他人读写。
- 读多写少不推荐,性能差
select * from products where id =3 for update;
update products set stock=2 where id =3
锁机制
乐观锁
- 对冲突抱有乐观态度,假设一般不会出现冲突
- 在数据提交更新的时候,才会对数据的冲突进行检测,若冲突了则返回错误信息,让程序决定如何去做。
- 适用于读多写少的场景
常见做法CAS(compare and set),方案一就是乐观锁。
悲观锁
-
对数据的冲突持有悲观态度。
-
具有强烈的占有和排他性,直接对数据进行加锁已防止并发。
方案二就是悲观锁 -
悲观锁生效的条件:1、innoDB,2、处于事务块中。
proxy_buffer_size 1024k;
proxy_buffers 16 1024k;
proxy_busy_buffers_size 2048k;
proxy_temp_file_write_size 2048k;
评论
请
登录后发表观点