【问题标题】:Does ServiceStack.OrmLite Support Optimistic ConcurrencyServiceStack.OrmLite 是否支持乐观并发
【发布时间】:2013-09-15 15:12:46
【问题描述】:

我很惊讶地发现没有关于该主题的文档,有人知道 OrmLite 是否支持乐观并发吗?欢迎提供任何文档或示例参考。

【问题讨论】:

  • 据我所知 Ormlite 提供 IDBConnection 的包装器,非常薄的包装器。如果您使用“使用”,它将为您关闭连接。并发没有什么特别的事情要做。事务也是 IDBConnection 的一部分。

标签: servicestack ormlite-servicestack


【解决方案1】:

这并不完全取决于 OrmLite。这取决于隔离级别和您的数据库设置。

例子:

using (var trans = Db.BeginTransaction(IsolationLevel.ReadCommitted) as SqlTransaction)
            {
                try
                {
                    //do something
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }
            }
}

来自MS SQL Sever Docs

已提交阅读
指定语句不能读取具有 已被其他事务修改但未提交。这可以防止 脏读。 数据可以被其他交易改变 当前事务中的单个语句,导致 不可重复读取或幻像数据。此选项是 SQL Server 默认。 READ COMMITTED 的行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项:

如果 READ_COMMITTED_SNAPSHOT 设置为 ON,则数据库引擎使用行 版本控制以呈现每个语句的事务一致 语句开始时存在的数据快照。 锁不用于保护数据不被其他人更新 交易。

或者,您可以使用 BeginTransaction(IsolationLevel.Snapshot) 并具有乐观并发,因为您可以避免锁定,但 SQL Server 在提交之前使用 rowversion 以避免修改在当前事务之外修改的数据。

来自其他MS SQL Server docs

快照隔离下运行的交易采取乐观态度 通过获取数据之前的锁来修改数据的方法 执行修改只是为了强制约束。否则, 在要修改数据之前不会在数据上获取锁。什么时候 一个数据行满足更新条件,快照事务 验证数据行没有被并发修改 在快照事务开始后提交的事务。如果 数据行已在快照事务之外被修改,一个 发生更新冲突,快照事务终止。这 更新冲突由数据库引擎处理,没有办法 禁用更新冲突检测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多