Browse Source

修改评卷分组任务数量更新方式,避免并发访问死锁产生

luoshi 6 years ago
parent
commit
9bd433a8c7

+ 2 - 33
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java

@@ -10,7 +10,6 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 public interface MarkGroupDao
@@ -50,38 +49,8 @@ public interface MarkGroupDao
     Integer sumMarkedCount(Integer examId);
 
     @Modifying
-    @Query("update MarkGroup g set g.libraryCount=(select count(l) from MarkLibrary l "
-            + "where l.examId=?1 and l.subjectCode=?2 and l.groupNumber=g.pk.number) "
-            + "where g.pk.examId=?1 and g.pk.subjectCode=?2")
-    void updateLibraryCount(int examId, String subjectCode);
-
-    @Modifying
-    @Query("update MarkGroup g set g.markedCount=(select count(l) from MarkLibrary l "
-            + "where l.examId=?1 and l.subjectCode=?2 and l.groupNumber=g.pk.number and l.status in (?3)) "
-            + "where g.pk.examId=?1 and g.pk.subjectCode=?2")
-    void updateMarkedCount(int examId, String subjectCode, LibraryStatus... status);
-
-    @Modifying
-    @Query("update MarkGroup g set g.leftCount = g.libraryCount - g.markedCount "
-            + "where g.pk.examId=?1 and g.pk.subjectCode=?2")
-    void updateLeftCount(int examId, String subjectCode);
-
-    @Modifying
-    @Query("update MarkGroup g set g.libraryCount=(select count(l) from MarkLibrary l "
-            + "where l.examId=?1 and l.subjectCode=?2 and l.groupNumber=?3) "
-            + "where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
-    void updateLibraryCount(int examId, String subjectCode, int number);
-
-    @Modifying
-    @Query("update MarkGroup g set g.markedCount=(select count(l) from MarkLibrary l "
-            + "where l.examId=?1 and l.subjectCode=?2 and l.groupNumber=?3 and l.status in (?4) ) "
-            + "where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
-    void updateMarkedCount(int examId, String subjectCode, int number, LibraryStatus... status);
-
-    @Modifying
-    @Query("update MarkGroup g set g.leftCount = g.libraryCount - g.markedCount "
-            + "where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
-    void updateLeftCount(int examId, String subjectCode, int number);
+    @Query("update MarkGroup g set g.libraryCount=?4, g.markedCount=?5, g.leftCount=(?4-?5) where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
+    void updateLibraryCount(int examId, String subjectCode, int number, int totalCount, int markedCount);
 
     @Modifying
     @Query("update MarkGroup g set g.leftCount = g.libraryCount, g.markedCount = 0 "

+ 7 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -43,6 +43,13 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     List<MarkLibrary> findByStudentIdAndGroupNumberAndStatus(Integer studentId, Integer groupNumber,
             LibraryStatus status);
 
+    @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3")
+    long countByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
+
+    @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.status in (?4)")
+    long countByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode, Integer groupNumber,
+            LibraryStatus... status);
+
     @Query("select count(*) from MarkLibrary f where f.studentId=?1 and f.groupNumber=?2")
     long countByStudentIdAndGroupNumber(Integer studentId, Integer groupNumber);
 

+ 9 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -549,10 +549,12 @@ public class MarkServiceImpl implements MarkService {
      * @param groupNumber
      */
     @Override
+    @Transactional
     public void updateLibraryCount(Integer examId, String subjectCode, Integer groupNumber) {
-        groupDao.updateLibraryCount(examId, subjectCode, groupNumber);
-        groupDao.updateMarkedCount(examId, subjectCode, groupNumber, LibraryStatus.MARKED, LibraryStatus.ARBITRATED);
-        groupDao.updateLeftCount(examId, subjectCode, groupNumber);
+        groupDao.updateLibraryCount(examId, subjectCode, groupNumber,
+                (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber),
+                (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(examId, subjectCode, groupNumber,
+                        LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
     }
 
     /**
@@ -565,9 +567,10 @@ public class MarkServiceImpl implements MarkService {
     @Transactional
     @Override
     public void updateLibraryCount(Integer examId, String subjectCode) {
-        groupDao.updateLibraryCount(examId, subjectCode);
-        groupDao.updateMarkedCount(examId, subjectCode, LibraryStatus.MARKED, LibraryStatus.ARBITRATED);
-        groupDao.updateLeftCount(examId, subjectCode);
+        List<MarkGroup> groups = groupDao.findByExamIdAndSubjectCode(examId, subjectCode);
+        for (MarkGroup group : groups) {
+            updateLibraryCount(examId, subjectCode, group.getNumber());
+        }
     }
 
     /**