重复输入会导致mysql死锁

时间:2017-01-20 10:36:16

标签: python mysql flask flask-sqlalchemy

我使用flask-flask-sqlalchemy的烧瓶来记录应用程序用户的统计数据增量,我收到了这个错误:

(_mysql_exceptions.IntegrityError) (1062, "Duplicate entry '2017-2' for key 'uq_weekstatistics_year_week'") [SQL: 'INSERT INTO week_statistics (year, week, count) VALUES (%s, %s, %s)'] [parameters: (2017, 2, 1)]

这是我的模特:

class WeekStatistics(db.Model):
__tablename__ = 'week_statistics'
id = db.Column(db.Integer, primary_key=True)
year = db.Column(db.Integer, default=int(datetime.now().strftime('%Y')), nullable=False)
week = db.Column(db.Integer, default=int(datetime.now().strftime('%W')), nullable=False)
count = db.Column(db.Integer, default=0)

__table_args__ = (db.UniqueConstraint(''year', 'week',
                                      name='uq_weekstatistics_year_week'), )

这是api中的代码:

week_statistics = WeekStatistics.query.with_lockmode("update").\
        filter_by(year=int(datetime.now().strftime('%Y')),
                  week=int(datetime.now().strftime('%W'))).first()
if week_statistics is None:
    week_statistics = WeekStatistics()
    week_statistics.count = 1
else:
    week_statistics.count += 1
try:
    db.session.add(week_statistics)
    db.session.commit()
except Exception as e:
   print(e)
   db.session.rollback()

mysql:5.6,innodb引擎,RR隔离级别。

如果我的数据库中没有这样的记录,则会发生此错误,并且我的数据库会出现并死锁,如果存在这样的记录,则效果很好。

在我看来,在并发条件下,多个事务开始并插入相同的记录,只有一个事务可以提交插入而其他事务会回滚。但是为什么会出现死锁,这种死锁会导致我的所有数据库查询和更新失败。

0 个答案:

没有答案