实体框架事务

2024-03-16

我有一个程序在两台服务器上重复运行。 我需要在程序中选择和更新数据库记录,因此我需要来自EF的表锁或事务,否则程序的每个副本都可以选择和修改相同的记录。虽然第一个副本使数据库发生更改,但另一个副本不应运行相同的代码部分。

我在 EF 中找到了 TransactionScope,但它无法正常工作,因为当第一个副本运行时,我可以在 SQL Server MGM studio 中对该表进行许多选择和更新。

我有一个简短的代码片段,请验证它:

using (TransactionScope transaction = new TransactionScope())
{
    //select some records which aren't locked by the other copy of the program
    //condition: Locked==null
    recipientsList = (from c in context.Recipients
                      where
                          c.SentToPlatform == false && c.PopupID != null &&
                          c.Message.MessageStatus == 2 && c.Locked == null
                      select c).Take(piecePerMinute).ToList();

    foreach (var recipient in recipientsList)
    {
        //i need make some changes on the record, prevent it from the other copy of program
        //I need to change locked column to true
        recipient.Locked = true;
        recipient.LockBy = ipAddress;
        Console.Write("I");
        Thread.Sleep(1000);
    }

    //close transaction
    try
    {
        context.SaveChanges();
        transaction.Complete();
    } catch (Exception ex )
    {


    }
}

从技术上来说您要求的是一个长时间(呃)运行的事务,其隔离级别高于已提交读(默认级别)。没有足够的信息让我知道您是否想要 RepeatableRead 还是 Serialzable(以避免幻象插入)。

您可以通过执行以下操作来完成您的要求:

var opt = new TransactionOptions();
    opt.IsolationLevel = IsolationLevel.Serializable;

using (var scope = new TransactionScope(TransactionScopeOption.Required, opt) ){

   //read table code

   //write table code

   //save context & complete scope

}

照这样说,我非常怀疑这就是你真正想要的。可序列化事务可能会使数据库的大部分内容处于锁定状态。这意味着什么?以下是 Microsoft 对可序列化事务的描述:

SERIALIZABLE 指定以下内容:

  • 语句无法读取已被其他事务修改但尚未提交的数据。
  • 在当前事务完成之前,任何其他事务都不能修改当前事务已读取的数据。
  • 在当前事务完成之前,其他事务无法插入其键值落在当前事务中任何语句读取的键范围内的新行。

范围锁放置在与事务中执行的每个语句的搜索条件相匹配的键值范围内。这会阻止其他事务更新或插入符合当前执行的任何语句的任何行。 交易。

....

由于并发量较低,仅在必要时使用此选项.

正如@Bertie 指出的,实体框架是围绕乐观并发模型构建的。使用乐观并发 (OC) 的原因有很多,并且处理不可避免的冲突的模式也有很多。 OC让你变得更高更有趣。对所有事情使用序列化交易会让你像《12只猴子》中的布鲁斯·威利斯一样——在你的软垫房间的地板上塞满了氯磺嗪。你现在不想要这样了,是吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架事务 的相关文章

随机推荐

  • 如何调用具有可变数量参数的实现?

    为了简单起见 假设我有一个类似的函数 void myFunc id self SEL cmd id first 在该方法中 我想调用 self 超类的实现 imp 我可以使用以下代码到达该 IMP Class class object ge
  • Python 如何检查迭代器工具链中是否已到达最后一个元素?

    for elt in itertools chain from iterable node if elt is the last element do statement 我如何实现这一目标 您可以通过使用以下命令在 while 循环中手动
  • BFG Repo Cleaner的正确使用方法

    The BFG 回购清理器 https rtyley github io bfg repo cleaner 网站给出了使用该工具清理存储库的示例 如下所示 克隆您的存储库的新副本 git clone mirror git example c
  • 模块化、基于组件的 Sinatra 应用程序的架构

    我正在开发一个 Sinatra 应用程序 其中包含大约 10 个不同的功能组件 我们希望能够将这些组件混合并匹配到应用程序的单独实例中 完全通过 config yaml 文件进行配置 如下所示 components route chunky
  • 同一表中的 MySQL 计数,包括零计数值

    我有这个带有数据的表结构 INSERT INTO test id email id user ref name VALUES 1 email protected cdn cgi l email protection NULL Mike 2
  • Ember.js 渲染大型列表而不锁定浏览器

    当需要在客户端渲染大量项目时 我对 Ember js 有哪些选择 分页是一种减少渲染时间的明显方法 但是还有其他技巧可以让您渲染一个大的项目列表 而不会在 JavaScript 执行时出现明显的浏览器冻结吗 ember 列表视图 https
  • CakePHP 和子查询

    如何使用 cake 语法编写 SQL 子查询 我知道如何编写简单的查询 但无法处理子查询 这是原始查询 SELECT Assumption id Referee id Referee first name Referee second na
  • TFIDF 矢量器给出错误

    我正在尝试使用 TFIDF 和 SVM 对某些文件进行文本分类 一次要选择 3 个单词的特征 我的数据文件已经采用以下格式 天使之眼 每一个都有其自己的 没有停用词 也不能进行旅鼠或词干提取 我希望该功能被选择为 天使眼有 我编写的代码如下
  • 将各种类型的函数应用于值

    假设我有一个方法将多个函数应用于一个值 用法示例 String value a string with numb3r5 Function
  • CSS:Helvetica 是 Mac 上默认的“无衬线”字体,Arial 是 Windows 上默认的无衬线字体吗?

    我有很多 CSS 可以执行以下操作 font family Helvetica Arial sans serif 据我了解 Helvetica 是 Mac 上的默认无衬线字体 Arial 是 Windows 上的默认无衬线字体 如果是这样的
  • Spring Boot Actuator Endpoints 安全性不适用于自定义 Spring Security 配置

    这是我的 Spring Boot 1 5 1 执行器application properties Spring Boot Actuator management contextPath actuator management securit
  • web2py - 如何注入 html

    我使用 rows xml 生成 html 输出 我想知道如何向生成的 html 页面添加 html 代码 例如 添加徽标 链接 css 文件等 rows db db member membership id request args 0 s
  • 使用 Google Static Maps API URL 渲染多边形

    我创建了一个脚本 通过将属性附加到静态地图 URL 来存储动态地图输入 以便我们可以在用户提交后引用它 由于我尚无法确定的原因 Polygon 根本不使用基本静态地图 URL 进行渲染 但它可以与第 3 方站点的静态地图功能配合使用 根据静
  • Google Sheets 查询删除标题不适用于偏移量

    无法弄清楚为什么其中一些查询有效而另一些则无效 只是想建立一个我自己的桌子 query TRANSPOSE ImportHtml C7 table 1 select limit 1 offset 1 query TRANSPOSE Impo
  • 使用逗号表示小数,使用句点表示千位 rdlc 报告

    我正在使用报告查看器控件 rdlc 来生成报告 我的其中一列表示来自 SQL 数据库的十进制值 例如 5199 9800 在此栏的末尾 对所有金额进行求和 因此 金额行的表示方式如下 Fields DEBIT Value 总行的表示方式如下
  • 在 Google 地图上显示 OpenStreetMap 边界(使用 v3 api)

    我想使用使用以下工具获得的 GeoJSON 数据在 Google 地图上显示城市边界 我访问 nominatim openstreetmap org 并搜索一个城市 例如丹佛 使用检索到的 OSM ID 在本例中为 253750 然后我使用
  • Angularjs - 如何对表单验证进行单元测试

    我在用着Jasmine http jasmine github io 对我的 Angular 应用程序进行单元测试 如何在我的控制器中测试表单验证 例如我有一个登录功能 scope login function if scope form
  • JavaFX 2.0 TabPane:选项卡位于左侧并保持选项卡标题水平

    我正在尝试为 Web 应用程序开发 GUI 并且想设置一个 TabPane 其中选项卡放置在左侧 保持选项卡标题水平 我已经找到了如何将选项卡放在左侧 但经过多次搜索后 我没有成功将标题设置为右对齐 它们仍然是垂直的并且难以阅读 我该如何解
  • Android Studio 项目视图中的重复文件

    我有一个奇怪的问题 项目特定的根级别文件 gitignore gradlew gradle properties 等 在 Android Studio 的项目视图中显示两次 有人知道如何解决这个问题吗 我尝试重新导入项目 删除 iml 和
  • 实体框架事务

    我有一个程序在两台服务器上重复运行 我需要在程序中选择和更新数据库记录 因此我需要来自EF的表锁或事务 否则程序的每个副本都可以选择和修改相同的记录 虽然第一个副本使数据库发生更改 但另一个副本不应运行相同的代码部分 我在 EF 中找到了