Ver código fonte

解决死锁的问题

hurugang 5 anos atrás
pai
commit
0d546e394a

+ 6 - 1
src/main/java/cn/hnthyy/thmz/entity/his/MzSerialNo.java

@@ -2,6 +2,8 @@ package cn.hnthyy.thmz.entity.his;
 
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 门诊序号发生器
  */
@@ -21,7 +23,10 @@ public class MzSerialNo {
     private Integer serialNew;
     //暂不使用
     private String hzylNo;
-
+    //增加的主键 唯一值为1
+    private Long id;
+    //修改时间
+    private Date updateTime;
 
     //修改时新设置的 病人ID流水号
     private String newOutpatientNo;

+ 8 - 5
src/main/java/cn/hnthyy/thmz/mapper/his/MzSerialNoMapper.java

@@ -1,25 +1,28 @@
 package cn.hnthyy.thmz.mapper.his;
 
 import cn.hnthyy.thmz.entity.his.MzSerialNo;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.util.Date;
+
 public interface MzSerialNoMapper {
 
 
     /**
      * 加锁
-     * @param mzSerialNo
+     * @param updateTime
      * @return
      */
-    @Update("update mz_serial_no set outpatient_no=outpatient_no where outpatient_no = #{outpatientNo} and serial_out=#{serialOut} and serial_new =#{serialNew}")
-    int updateForBlock(MzSerialNo mzSerialNo);
+    @Update("update mz_serial_no set update_time=#{updateTime,jdbcType=TIMESTAMP} where id = 1")
+    int updateForBlock(@Param("updateTime") Date updateTime);
 
     /**
      * 查询序列号记录
      * @return
      */
-    @Select("select serial_no,rtrim(outpatient_no) outpatient_no,inject_no,serial_out,prior_no,serial_new,hzyl_no from mz_serial_no")
+    @Select("select serial_no,rtrim(outpatient_no) outpatient_no,inject_no,serial_out,prior_no,serial_new,hzyl_no from mz_serial_no where id = 1")
     MzSerialNo selectMzSerialNo();
 
     /**
@@ -29,7 +32,7 @@ public interface MzSerialNoMapper {
      */
     @Update({"<script>",
             "update mz_serial_no ",
-            "<trim prefix='set' prefixOverrides=',' suffix=' where outpatient_no = #{outpatientNo} and serial_out=#{serialOut} and serial_new =#{serialNew}' >",
+            "<trim prefix='set' prefixOverrides=',' suffix=' where id =1 ' >",
                "<when test='newOutpatientNo!=null'>",
                   "outpatient_no =#{newOutpatientNo,jdbcType=VARCHAR}",
                "</when>",

+ 5 - 3
src/main/java/cn/hnthyy/thmz/service/impl/his/MzSerialNoServiceImpl.java

@@ -10,6 +10,8 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
+
 @Service
 public class MzSerialNoServiceImpl implements MzSerialNoService {
     @SuppressWarnings("all")
@@ -19,11 +21,11 @@ public class MzSerialNoServiceImpl implements MzSerialNoService {
     @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
     @Override
     public int getMzSerialNo() throws MzException {
+        mzSerialNoMapper.updateForBlock(new Date());
         MzSerialNo mzSerialNo = mzSerialNoMapper.selectMzSerialNo();
         if (mzSerialNo == null) {
             throw new MzException("序列号生成器不存在,请先设置!");
         }
-        mzSerialNoMapper.updateForBlock(mzSerialNo);
         mzSerialNo.setNewSerialOut(mzSerialNo.getSerialOut() + 1);
         int num = mzSerialNoMapper.updateMzSerialNo(mzSerialNo);
         if (num == 0) {
@@ -35,11 +37,11 @@ public class MzSerialNoServiceImpl implements MzSerialNoService {
     @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
     @Override
     public String getMzPatientNo() throws MzException {
+        mzSerialNoMapper.updateForBlock(new Date());
         MzSerialNo mzSerialNo = mzSerialNoMapper.selectMzSerialNo();
         if (mzSerialNo == null) {
             throw new MzException("序列号生成器不存在,请先设置!");
         }
-        mzSerialNoMapper.updateForBlock(mzSerialNo);
         Integer newOutpatientNo=Integer.valueOf(mzSerialNo.getOutpatientNo()) + 1;
         mzSerialNo.setNewOutpatientNo(newOutpatientNo.toString());
         int num = mzSerialNoMapper.updateMzSerialNo(mzSerialNo);
@@ -52,11 +54,11 @@ public class MzSerialNoServiceImpl implements MzSerialNoService {
     @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
     @Override
     public int getSerialNo() throws MzException {
+        mzSerialNoMapper.updateForBlock(new Date());
         MzSerialNo mzSerialNo = mzSerialNoMapper.selectMzSerialNo();
         if (mzSerialNo == null) {
             throw new MzException("序列号生成器不存在,请先设置!");
         }
-        mzSerialNoMapper.updateForBlock(mzSerialNo);
         mzSerialNo.setNewSerialNew(mzSerialNo.getSerialNew() + 1);
         int num = mzSerialNoMapper.updateMzSerialNo(mzSerialNo);
         if (num == 0) {