MySQL 数据库 乐观锁版本号更新报 Row was updated or deleted 错误如何处理

MySQL 数据库阿木 发布于 2025-07-08 11 次阅读


摘要:

在数据库操作中,乐观锁是一种常见的并发控制机制,用于解决多线程或分布式系统中数据并发更新时的冲突问题。在使用乐观锁时,可能会遇到“Row was updated or deleted”的错误。本文将深入探讨这一错误的原因,并提供相应的解决方案和代码示例。

一、

乐观锁是一种基于假设冲突很少发生的设计理念,通过在数据表中添加一个版本号字段来实现。每次更新数据时,都会检查版本号是否与读取时的版本号一致,如果不一致,则认为数据已被其他事务修改,拒绝当前更新操作。在实际应用中,由于各种原因,可能会遇到“Row was updated or deleted”的错误。

二、错误原因分析

1. 事务隔离级别不正确

2. 读取数据与更新数据不在同一事务中

3. 数据库引擎不支持乐观锁

4. 版本号字段更新逻辑错误

三、解决方案

1. 优化事务隔离级别

2. 确保读取数据与更新数据在同一事务中

3. 选择支持乐观锁的数据库引擎

4. 检查版本号字段更新逻辑

四、代码示例

以下是一个使用MySQL数据库和InnoDB引擎实现乐观锁的示例代码:

python

import pymysql

连接数据库


connection = pymysql.connect(host='localhost', user='root', password='password', database='test', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

try:


with connection.cursor() as cursor:


查询数据


cursor.execute("SELECT id, version FROM user WHERE id = %s", (1,))


result = cursor.fetchone()


if result:


获取版本号


version = result['version']


更新数据


cursor.execute("UPDATE user SET name = %s, version = version + 1 WHERE id = %s AND version = %s", ('Alice', 1, version))


提交事务


connection.commit()


print("Data updated successfully.")


else:


print("No data found.")


finally:


connection.close()


五、错误处理

1. 当遇到“Row was updated or deleted”错误时,首先检查事务隔离级别是否正确。如果隔离级别过高,可能会导致锁等待时间过长,从而引发错误。可以尝试降低隔离级别,例如将`REPEATABLE READ`改为`READ COMMITTED`。

2. 确保读取数据与更新数据在同一事务中。如果不在同一事务中,可以尝试将读取和更新操作放在同一个事务中执行。

3. 检查数据库引擎是否支持乐观锁。InnoDB引擎支持乐观锁,而MyISAM引擎不支持。如果使用MyISAM引擎,需要更换为InnoDB引擎。

4. 检查版本号字段更新逻辑是否正确。确保在更新数据时,版本号字段正确增加。

六、总结

本文深入分析了MySQL乐观锁版本号更新报错“Row was updated or deleted”的原因,并提供了相应的解决方案和代码示例。在实际应用中,我们需要根据具体情况选择合适的方法来处理这一错误,以确保数据的一致性和系统的稳定性。

注意:本文代码示例仅供参考,实际应用中可能需要根据具体情况进行调整。