ServiceStack.OrmLite是否支持乐观并发

时间:2013-07-01 13:26:23

标签: servicestack ormlite-servicestack

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

1 个答案:

答案 0 :(得分: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

  

READ COMMITTED
  指定语句无法读取具有的数据   已被修改但未被其他交易承诺。这可以防止   脏读。 可以通过其他事务更改数据   导致当前交易中的个别陈述   不可重复的读取或幻像数据。此选项是SQL Server   默认。 READ COMMITTED的行为取决于的设置   READ_COMMITTED_SNAPSHOT数据库选项:

     

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

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

来自其他MS SQL Server docs

  

快照隔离下运行的交易采取乐观态度   通过以前获取数据锁来实现数据修改的方法   执行修改仅强制执行约束。除此以外,   在修改数据之前,不会对数据进行锁定。什么时候   数据行符合更新条件即快照事务   验证并发数据行未修改数据行   快照事务开始后提交的事务。如果   数据行已在快照事务之外进行了修改   发生更新冲突并终止快照事务。该   更新冲突由数据库引擎处理,没有办法   禁用更新冲突检测。