我很惊讶地发现没有关于这个主题的文档,有人知道OrmLite是否支持乐观并发?任何文档或示例参考都是最受欢迎的。
答案 0 :(得分:1)
这不是真的由OrmLite决定。这取决于隔离级别和数据库设置。
示例:
using (var trans = Db.BeginTransaction(IsolationLevel.ReadCommitted) as SqlTransaction)
{
try
{
//do something
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
}
}
READ COMMITTED
指定语句无法读取具有的数据 已被修改但未被其他交易承诺。这可以防止 脏读。 可以通过其他事务更改数据 导致当前交易中的个别陈述 不可重复的读取或幻像数据。此选项是SQL Server 默认。 READ COMMITTED的行为取决于的设置 READ_COMMITTED_SNAPSHOT数据库选项:如果READ_COMMITTED_SNAPSHOT设置为ON,则数据库引擎使用行 版本控制以使事务一致性呈现每个语句 在语句开头存在的数据快照。 锁不用于保护数据免受其他人的更新 交易。
或者,您可以使用BeginTransaction(IsolationLevel.Snapshot)
并具有乐观并发性以避免锁定,但SQL Server在提交之前使用rowversion以避免修改在当前事务之外修改的数据。
来自其他MS SQL Server docs:
在快照隔离下运行的交易采取乐观态度 通过以前获取数据锁来实现数据修改的方法 执行修改仅强制执行约束。除此以外, 在修改数据之前,不会对数据进行锁定。什么时候 数据行符合更新条件即快照事务 验证并发数据行未修改数据行 快照事务开始后提交的事务。如果 数据行已在快照事务之外进行了修改 发生更新冲突并终止快照事务。该 更新冲突由数据库引擎处理,没有办法 禁用更新冲突检测。