由于本人菜鸡,没接触过太大的并发量,只用过Redis那一套(Redis的写性能和读性能都远高于MySQL)
多线程对数据库中的库存进行修改扣减的时候,会出现超卖或是死锁情况,如下:
问题一:超卖
当多个线程执行select然后再进行update时,由于mysql的select并未进行加锁,导致查询出的库存信息与实际的库存数量不一致,导致update时候一直扣减到了负数。
package com.example.service;
import java.sql.*;
import java.util.Random;
/**
* 模拟多线程下并发扣减库存问题
*/
public class KuCunTest {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
Object object = new Object();
for (int i = 0; i < 100; i++) {
//初始情况多线程进行竞争 会导致 超卖以及死锁
new ThreadChaoMai(false).start();
}
}
// 超卖情况
private static class ThreadChaoMai extends Thread {
private boolean testDeadLock;
Threa