3

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

4

1 回答 1

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 服务器文档

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

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

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

从其他MS SQL Server 文档

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

于 2013-09-15T06:43:26.877 回答