diff --git a/事务.md b/事务.md index d9c3a6e..defc823 100644 --- a/事务.md +++ b/事务.md @@ -87,6 +87,19 @@ using (var ctx = fsql.CreateDbContext()) { } ``` +## 更新排他锁 + +```csharp +var user = fsql.Select().ForUpdate(true).Where(a => a.Id == 1).ToOne(); +//SELECT ... FROM User a for update nowait +``` + +for update 在 Oracle/PostgreSQL/MySql 是通用的写法,我们对 SqlServer 做了特别适配,执行的 SQL 语句大致如下: + +```sql +SELECT ... FROM [User] a With(UpdLock, RowLock, NoWait) +``` + ## 更多资料 - [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7) diff --git a/修改.md b/修改.md index 65b40bf..9db3f26 100644 --- a/修改.md +++ b/修改.md @@ -133,13 +133,13 @@ var t10 = update.SetRaw("Title = @title", new { title = "新标题" }).Where("Id 在使用 IgnoreColumns 的情况下,只有未被指定的列会保存; -## 行级锁(乐观锁) +## 乐观锁 更新整个实体数据时,在并发情况下极容易造成旧数据将新的记录更新。 -行级锁的原理,是利用实体某字段,如:long version,更新前先查询数据,此时 version 为 1,更新时产生的 SQL 会附加 where version = 1,当修改失败时(即 Affrows == 0)抛出异常。 +乐观锁的原理,是利用实体某字段,如:long version,更新前先查询数据,此时 version 为 1,更新时产生的 SQL 会附加 where version = 1,当修改失败时(即 Affrows == 0)抛出异常。 -每个实体只支持一个行级锁属性,在属性前标记特性:[Column(IsVersion = true)] 即可。 +每个实体只支持一个乐观锁属性,在属性前标记特性:[Column(IsVersion = true)] 即可。 > 适用 SetSource 更新,每次更新 version 的值都会增加 1 diff --git a/实体特性.md b/实体特性.md index 4c944dd..029dea8 100644 --- a/实体特性.md +++ b/实体特性.md @@ -153,9 +153,9 @@ class Topic { 更新整个实体数据时,在并发情况下极容易造成旧数据将新的记录更新。 -行级锁的原理,是利用实体某字段,如:long version,更新前先查询数据,此时 version 为 1,更新时产生的 SQL 会附加 where version = 1,当修改失败时(即 Affrows == 0)抛出异常。 +乐观锁的原理,是利用实体某字段,如:long version,更新前先查询数据,此时 version 为 1,更新时产生的 SQL 会附加 where version = 1,当修改失败时(即 Affrows == 0)抛出异常。 -每个实体只支持一个行级锁属性。 +每个实体只支持一个乐观锁属性。 > 适用 SetSource 更新,无论使用什么方法更新 version 的值都会增加 1 diff --git a/更新日志.md b/更新日志.md index 6b6b431..9ea88de 100644 --- a/更新日志.md +++ b/更新日志.md @@ -1,8 +1,10 @@ 完整版本:年数-月-日-当日版本号,FreeSql、FreeSql.Repository、FreeSql.DbContext 版本号相同。 -## v0.12.19 +## v0.12.20 +- 增加 ISelect.ForUpdate 排他更新锁(根据数据库类型的规则,见代码注释); +- 完善 SqlServer WithLock 功能,组合多种使用 | 枚举相联; - 补充 同线程时间 fsql.Transaction 事务等级参数的传入; - 调整 fsql.Transaction(Action, Timeout) 参数顺序; - 修复 FreeSql.Generator NameOptions 参数未设置时的错误; @@ -684,7 +686,7 @@ class Topic { ## v0.3.27 -- 增加 行级锁功能,适用修改实体,[参考资料](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9); +- 增加 乐观锁功能,适用修改实体,[参考资料](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9); - 增加 FreeSql.Repository 默认依赖注入的方式,同时保留原有 Autofac; - 优化 FreeSql.Repository Insert 逻辑,参考了 FreeSql.DbContext; - 优化 FreeSql.IUpdate 参照 IInsert 对大批量更新,拆分执行;