我使用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隔离级别。
如果我的数据库中没有这样的记录,则会发生此错误,并且我的数据库会出现并死锁,如果存在这样的记录,则效果很好。
在我看来,在并发条件下,多个事务开始并插入相同的记录,只有一个事务可以提交插入而其他事务会回滚。但是为什么会出现死锁,这种死锁会导致我的所有数据库查询和更新失败。