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; } }