0

我的代码中有一个不可避免的 bulk_create 死锁。我决定在原子块内处理这部分,并在发生死锁时重新发出事务。像这样的东西:

while True:
    try:
        with transaction.atomic():
            bulk_create_some_data()

        return
    except OperationalError:
        log_error()

        continue

但这会导致错误You can't execute queries until the end of the 'atomic' block。我检查了语句的历史记录,mysql发现保存点已损坏,如下日志所示。

*************************** 1. row ***************************    
event_id: 1                                                                      
SQL_TEXT: set autocommit=0                                                                                                                                               
MESSAGE_TEXT: NULL                                                                                                                                                                                                                      
*************************** 2. row ***************************                                                                                                                   
event_id: 2                                                                                                                                                                 
SQL_TEXT: SAVEPOINT `s139836523404544_x2`                                                                                                                                
MESSAGE_TEXT: NULL                                                                    
*************************** 3. row ***************************
event_id: 3 
SQL_TEXT: INSERT INTO `Transaction` ... 
MESSAGE_TEXT: Deadlock found when trying to get lock; try restarting transaction                                                                                             
*************************** 4. row ***************************                                                                                                                   
event_id: 4                                                                                                                                                                 
SQL_TEXT: ROLLBACK TO SAVEPOINT `s139836523404544_x2`                                                                                                                    
MESSAGE_TEXT: SAVEPOINT s139836523404544_x2 does not exist 

我发现这个解释保存点损坏的线程是可能的,它是一个旧线程,我不确定它是否仍然有效。如何管理这样的场景以防止不可避免的锁定导致我的程序崩溃。我正在使用 django 3.1 和 mysql 8.0。

4

0 回答 0