常见的死锁问题分析

IDeadLockService:
package com.impl;

import com.entity.Student;

public interface IDeadLockService {
    void pickUpSku(String cellNo,String sku,int amout);
    void checkSku(String cellNo,String sku,int amout);
    void lockfailed(String cellNo,String sku,int amout);
    void pickUpSkuLock(String cellNo,String sku,int amout);
    void checkSkuLock(String cellNo,String sku,int amout);
}

 

DeadLockServiceImpl:
package com.service;

import com.dao.StudentDao;
import com.entity.Student;
import com.impl.IDeadLockService;
import com.impl.IStudentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.UUID;

@Service
@Slf4j
public class DeadLockServiceImpl implements IDeadLockService {

    static final Object LOCK_A=new Object();

    static final Object LOCK_B=new Object();

    /**
     * oracle级别死锁--checkSku 行级锁死锁
     * @param cellNo
     * @param sku
     * @param amout
     */
    @Override
    @Transactional
    public void pickUpSku(String cellNo, String sku, int amout) {
        //更新仓位库存

        //更新订单状态
    }

    /**
     * oracle级别死锁--pickUpSku 行级锁死锁
     * @param cellNo
     * @param sku
     * @param amout
     */
    @Override
    @Transactional
    public void checkSku(String cellNo, String sku, int amout) {
        //更新订单状态

        //更新仓位库存
    }

    /**
     * 直白点说,保证不了查询出来的值是“对的”。因为另外的一个线程B可能释放了同步锁,但是事务还没有提交!
     * 导致本线程A进入同步锁后,查询出来的库存是另外的一个线程B还未提交的数据。
     * @param cellNo
     * @param sku
     * @param amout
     */
    @Override
    @Transactional
    public void lockfailed(String cellNo, String sku, int amout) {
        synchronized (this)
        {
            //模拟数据库更新库存
            int restQtyQueryDb=queryDb(cellNo,sku);

            int restQty=restQtyQueryDb-amout;

            //模拟数据库查询剩余库存
            int updateRestQty=updateDb(cellNo,sku);
        }
    }

    /**
     * JVM级别死锁--checkSkuLock
     * @param cellNo
     * @param sku
     * @param amout
     */
    @Override
    public void pickUpSkuLock(String cellNo, String sku, int amout) {
        synchronized (LOCK_A)
        {
            synchronized (LOCK_B)
            {

            }
        }
    }

    /**
     * JVM级别死锁--pickUpSkuLock
     * @param cellNo
     * @param sku
     * @param amout
     */
    @Override
    public void checkSkuLock(String cellNo, String sku, int amout) {
        synchronized (LOCK_B)
        {
            synchronized (LOCK_A)
            {

            }
        }

    }

    //模拟数据库更新库存
    private int updateDb(String cellNo, String sku) {
        return 0;
    }

    //模拟数据库查询剩余库存
    private int queryDb(String cellNo, String sku) {
        return 0;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值