Mysql中update语句执行报错:affected rows is more than 10, affected rows is more than expected,使用主键ID解决。

Mysql中update语句执行报错:affected rows is more than 10, affected rows is more than expected,使用主键ID解决。

在操作mysql语句时,update某个表A的date类型字段时,有两个where条件,一直报错,提示数据表中变化的行数超过10行,无法更新成功。开始认为是字段的日期类型设置不对导致该报错,经过多次尝试仍报错。脚本如下:
update A set A.a=‘2020-07-31’
where A.name=‘张三’
and A.学科 ;

参考了其他前辈提供的经验建议使用to_date()、adddate()、DATE_ADD()等函数,同样报错;
后经判断,是否为引起两个条件导致唯一索引重复,于是去掉了以上两个条件,用主键ID代替:
update A set A.a=‘2020-07-31’
where A.主键ID=‘123456’;
返回Affected rows: 1;更新成功。

### 乐观锁理论详解 #### 什么是乐观锁? 乐观锁(Optimistic Locking)是一种基于假设的数据并发控制方法,其核心理念在于假定多用户并发操作时冲突发生的概率较低。因此,在实际执行更新之前并不对数据进行锁定,而是等到提交更新前才检查是否存在冲突[^1]。 #### 实现方式 乐观锁主要依赖于版本号或者特定字段的比较来进行实现。常见的实现思路包括以下两种: 1. **使用版本号** 在数据库表中新增一个`version`字段,每次更新记录时都会验证当前版本号是否与预期一致。如果一致,则允许更新并同时将版本号加一;如果不一致,则表示该条目已被其他事务修改过,从而拒绝本次更新请求。 2. **利用原始值校验** 这种方式类似于CAS (Compare And Swap),即先查询目标列的初始状态作为参照依据,在后续更新语句中加入额外条件限定只有当现有数值等于先前取得的那个旧值时才能完成写入动作。例如: ```sql UPDATE table_name SET column_value = new_value, version = version + 1 WHERE id = target_id AND version = old_version; ``` #### 对比悲观锁 相比于悲观锁全程占用资源直至结束整个流程的做法,乐观锁更加灵活高效,尤其适用于那些竞争程度不高但又需要保障最终结果准确性的情形下[^4]。然而需要注意的是,一旦遇到频繁争抢相同对象的情况,由于不断重试失败而导致性能下降甚至死循环等问题也可能随之浮现出来。 #### 数据库中的应用实例 以SQL Server为例,在某些隔离级别如可重复读(Repeatable Read)或序列化(Serializable)之下,系统可能自动施加重叠型共享锁来阻止其他人更改已加载过的行内容直到本批次完全结束为止[^5]。不过严格来说这更接近传统意义上的封锁机制而非真正意义上面向逻辑层面设计出来的解决方案——真正的乐观锁应该由应用程序自行管理而不单纯依靠底层DBMS功能支持即可达成目的。 ```python def update_stock_with_optimistic_lock(conn, product_id, expected_quantity): cursor = conn.cursor() # 查询库存数量以及版本号 cursor.execute("SELECT quantity, version FROM products WHERE id=%s", (product_id,)) row = cursor.fetchone() current_quantity = row['quantity'] version = row['version'] if current_quantity >= expected_quantity: try: # 尝试减少库存,并且确保版本匹配 cursor.execute(""" UPDATE products SET quantity=quantity-%s, version=version+1 WHERE id=%s AND version=%s """, (expected_quantity, product_id, version)) affected_rows = cursor.rowcount if affected_rows != 1: raise Exception('Update failed due to concurrent modification.') conn.commit() # 提交成功后的变更 except Exception as e: conn.rollback() # 出错回滚 print(f'Error occurred during stock update: {e}') else: print('Insufficient inventory') ``` 上述代码片段展示了如何在一个Python程序里运用PostgreSQL或其他兼容ACID特性的关系型数据库实施基本形式的乐观锁控制措施。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值