Expand description
乐观锁(Optimistic Locking)
对应文档 6.8 节改进项 20(乐观锁支持)。
§核心概念
- OptimisticLock:Model trait,声明版本字段名
- build_update_with_lock:生成
UPDATE ... SET version = version + 1, ... WHERE pk = ? AND version = ? - LockError:版本冲突错误
- retry_on_conflict:冲突重试机制
§设计灵感
- Hibernate
@Version - Doctrine
@Version/LockMode::OPTIMISTIC - Yii2
OptimisticLockBehavior - MyBatis-Plus
@Version
§使用示例
use sz_orm_core::optimistic_lock::{OptimisticLock, build_update_with_lock};
use sz_orm_core::{DbType, get_dialect, Value};
use std::collections::HashMap;
// 1. 定义带 version 字段的 Model
struct Product {
id: i64,
name: String,
version: i64,
}
impl OptimisticLock for Product {
fn version_field() -> &'static str { "version" }
}
// 2. 生成乐观锁 UPDATE SQL
let dialect = get_dialect(DbType::MySQL).unwrap();
let mut data = HashMap::new();
data.insert("name".to_string(), Value::String("new-name".to_string()));
let sql = build_update_with_lock(&*dialect, "products", "id", "version", &Value::I64(1), &Value::I64(5), &data);
// UPDATE `products` SET `name` = 'new-name', `version` = `version` + 1 WHERE `id` = 1 AND `version` = 5Enums§
- Lock
Error - 乐观锁错误类型
Traits§
- Optimistic
Lock - 乐观锁 trait — Model 实现此 trait 以声明版本字段名
Functions§
- build_
delete_ with_ lock - 生成乐观锁 DELETE SQL(删除前校验版本号)
- build_
update_ with_ lock - 生成乐观锁 UPDATE SQL
- check_
affected_ rows - 检查 UPDATE/DELETE 受影响行数,0 表示版本冲突
- extract_
version - 从数据行(HashMap)中提取版本号
- retry_
on_ conflict - 在乐观锁冲突时自动重试
Type Aliases§
- Lock
Result - 乐观锁结果