-
Notifications
You must be signed in to change notification settings - Fork 3
Open
Description
众所周知,db.session.commit()
用于提交对数据库的更改。现在的设计中,所有的 commit 都放在数据库操作的专门模块中。虽然这样有助于解耦,但是这个引入了潜在的数据一致性问题。
想象这样一个场景:
@route
def handle():
result_a = process_a()
DB.put_something(result_a)
result_b = process_b()
DB.put_otherthing(result_b)
实际出现的场景如下 43, 59 行:
wxsls-pyfn/src/pkuphysu_wechat/api/x10n/views.py
Lines 43 to 59 in ff9d4bc
Datax10n.put_name(openid, result["name"], result["stuID"]) | |
prob_ids = Datax10n.get_probs(openid) | |
questions = result["questions"] | |
if len(questions) != settings.x10n.PROBLEMS_NUMBER: | |
return {"msg": "you have submit a list with wrong probids"} | |
for question in questions: | |
if question["number"] not in prob_ids: | |
return {"msg": "you have submit a list with wrong probids"} | |
question["answer"] = str(question["answer"]) == Datax10nProbs.get_ans( | |
question["number"] | |
) | |
user_result = { | |
"time": time_used, | |
"name": result["name"], | |
"questions": questions, | |
} | |
Datax10n.put_info(openid, user_result) |
如果 process_b
出了问题,那么数据库中的数据会出现意想不到的矛盾状态,这是我们不想看到的。
经典的解决方法就是一起 db.session.commit()
,两个写入操作一起提交,要么一起成功,要么都别写入,保证了数据的一致性。
所以需要对这部分的设计作更改。
stevenjoezhang and zqi-wong
Metadata
Metadata
Assignees
Labels
No labels