mq中有关比赛的操作增加事务

This commit is contained in:
virusdefender 2015-09-16 17:28:36 +08:00
parent 8e60d08f14
commit 571b42cfb5

View File

@ -4,6 +4,8 @@ import logging
import redis import redis
import json import json
from django.db import transaction
from judge.judger_controller.settings import redis_config from judge.judger_controller.settings import redis_config
from judge.judger.result import result from judge.judger.result import result
from submission.models import Submission from submission.models import Submission
@ -37,6 +39,7 @@ class MessageQueue(object):
problem.save() problem.save()
except Problem.DoesNotExist: except Problem.DoesNotExist:
logger.warning("Submission problem does not exist, submission_id: " + submission_id) logger.warning("Submission problem does not exist, submission_id: " + submission_id)
continue
# 更新该用户的解题状态 # 更新该用户的解题状态
try: try:
user = User.objects.get(pk=submission.user_id) user = User.objects.get(pk=submission.user_id)
@ -69,15 +72,11 @@ class MessageQueue(object):
contest_submission = ContestSubmission.objects.get(user_id=submission.user_id, contest=contest, contest_submission = ContestSubmission.objects.get(user_id=submission.user_id, contest=contest,
problem_id=contest_problem.id) problem_id=contest_problem.id)
# 提交次数加1 # 提交次数加1
with transaction.atomic():
if submission.result == result["accepted"]: if submission.result == result["accepted"]:
# 避免这道题已经 ac 了,但是又重新提交了一遍 # 避免这道题已经 ac 了,但是又重新提交了一遍
if not contest_submission.ac: if not contest_submission.ac:
# 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时 # 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时
# logger.debug(contest.start_time)
# logger.debug(submission.create_time)
# logger.debug((submission.create_time - contest.start_time).total_seconds())
# logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60))
contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds()) contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds())
contest_submission.total_time += contest_submission.ac_time contest_submission.total_time += contest_submission.ac_time
contest_submission.total_submission_number += 1 contest_submission.total_submission_number += 1
@ -95,6 +94,7 @@ class MessageQueue(object):
contest_problem.save() contest_problem.save()
except ContestSubmission.DoesNotExist: except ContestSubmission.DoesNotExist:
# 第一次提交 # 第一次提交
with transaction.atomic():
is_ac = submission.result == result["accepted"] is_ac = submission.result == result["accepted"]
first_achieved = False first_achieved = False
ac_time = 0 ac_time = 0
@ -113,6 +113,5 @@ class MessageQueue(object):
ac=is_ac, total_time=total_time, first_achieved=first_achieved, ac=is_ac, total_time=total_time, first_achieved=first_achieved,
ac_time=ac_time) ac_time=ac_time)
logger.debug("Start message queue") logger.debug("Start message queue")
MessageQueue().listen_task() MessageQueue().listen_task()