标签: optimistic-concurrency

使用 GET 和 INCR 的 redis 乐观锁定

我想乐观地“锁定”一段代码。伪代码如下:

revision = GET('lock_key') # default as 0
{
<<block of code>>
}
new_revision = INCR('lock_key')
if new_revision != revision + 1:
    raise Exception # now retry or whatever
Run Code Online (Sandbox Code Playgroud)

这对我来说很好,因为 INCR 和 GET 都是原子的。你觉得这种方法有什么问题吗?

python optimistic-locking optimistic-concurrency redis

4
推荐指数
1
解决办法
903
查看次数

MySQL是否具有等效的SQL Server rowversion?

我正在将SQL Server数据库架构迁移到MySQL.SQL Server上的某些表有一个rowversion类型的列.这是在首次插入行时设置的整数值,然后每次更新行的任何列时再次设置.该数字只会递增.

我们利用它来检查并发问题.因此,当插入到服务器时,我们可以检查传入值是否与当前存储值不同.如果是这样,那么自从导致此插入的读取以来,该行已被更新.然后我们可以拒绝更新,因为它基于过时的值.乐观并发.

在MySQL中是否存在对我们相同的等价物?

mysql rowversion optimistic-concurrency

4
推荐指数
2
解决办法
4724
查看次数

在Entity Framework中删除对象时的并发性

我正在使用实体框架开发一个Web应用程序.我加载一个对象列表并将其绑定到转发器以显示所有项目的摘要.用户可以单击转发器中的每个项目的编辑图标或删除图标.

例:

第1项| 编辑| 删除

第2项| 编辑| 删除

...

使用rowversion列进行并发时,编辑工作正常,因为加载了记录,ID和rowversion列的值保存在隐藏的表单字段中.然后,这些"原始"值可用于稍后进行更新时使用.

但是,如果用户单击Delete作为记录,我从数据库加载对象,调用DeleteObject(),然后调用SaveChanges().这个问题是当我加载记录时,它获取最新的rowversion值,因此任何并发检查都是无用的.

如何确保在删除记录时进行并发检查?

asp.net concurrency entity-framework optimistic-concurrency entity-framework-4

3
推荐指数
1
解决办法
1845
查看次数

在asp.net中使用时间戳和类型化数据集进行乐观并发

我正在使用c#和asp.net为我的网站创建一个论坛系统,对于数据访问,我使用的是类型化数据集,对于UI,我正在使用mvp模式.在我的数据库中,我有存储过程,我已添加到我的数据集中.问题是数据集不允许我选择"使用乐观并发"复选框,所以我必须自己实现乐观并发.我已经为我的表添加了一个时间戳列,现在我遇到了为每个用户保存此值的问题!那么什么状态管理方法是安全的,并且用于保存时间戳值的成本更低?

我想也许最好使用session来存储值,但是如果用户的数量增加,我会遇到内存资源问题但是我可以设置会话使用sql server而不是内存但我不知道会慢多少所以我无法决定.

任何帮助是赞赏的家伙!

编辑1:是的.我想跟踪行的最后一次修改,看它是否与用户拥有的那个匹配.但我不知道在哪里保存用户的时间戳值.

c# sql-server asp.net optimistic-concurrency

3
推荐指数
1
解决办法
1848
查看次数

如何处理org.eclipse.persistence.exceptions.OptimisticLockExceptio

我想通过使用乐观锁定来处理并发执行.我@Version在我的实体类中包含了注释.

在我的代码中,我同时运行两个线程.有时它正确执行.有时它是投掷org.eclipse.persistence.exceptions.OptimisticLockExceptionjavax.persistence.OptimisticLockException.

public class StudentCreation implements Runnable {
    EntityManagerFactory emf = 
        Persistence.createEntityManagerFactory("jpaApp");
    Student student = null;

    @Override
    public void run() {
        for (int i = 1; i <= 2; i++) {
            try {
                if (i % 2 == 0) {
                    update("XYZ");
                } else {
                    update("ABC");
                }
            } catch (Exception e) {
                System.out.println("Update exception");
            }
        }
    }

    // main method
    public static void main(String ar[]) {
        StudentCreation std1 = new StudentCreation();
        // creating two threads …
Run Code Online (Sandbox Code Playgroud)

jpa locking eclipselink optimistic-locking optimistic-concurrency

3
推荐指数
1
解决办法
6553
查看次数

Postgres中跨表的乐观并发控制

我正在寻找一种方法来管理 Postgres 中多个表的乐观并发控制。我还试图将业务逻辑排除在数据库之外。我有一个像这样的表设置:

CREATE TABLE master
(
    id SERIAL PRIMARY KEY NOT NULL,
    status VARCHAR NOT NULL,
    some_value INT NOT NULL,
    row_version INT NOT NULL DEFAULT(1)
)

CREATE TABLE detail
(
    id SERIAL PRIMARY KEY NOT NULL,
    master_id INT NOT NULL REFERENCES master ON DELETE CASCADE ON UPDATE CASCADE,
    some_data VARCHAR NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

master.row_version 每当更新行时,触发器都会自动递增。

客户端应用程序执行以下操作:

  1. master表中读取记录。
  2. 根据记录的值计算一些业务逻辑,这可能包括涉及用户交互的几分钟延迟。
  3. detail根据步骤 2 中的逻辑向表中插入一条记录。

如果master.row_version自从在第 1 步读取记录后的值发生了变化,我希望第 3 步被拒绝。在我看来,乐观并发控制是正确的答案(唯一的答案?),但我不确定如何管理它两张这样的桌子。

我在想 Postgres 中的一个函数在表中的相关记录上有一个行级锁master可能是要走的路。但我不确定这是否是我最好的/唯一的选择,或者它会是什么样子(我对 …

postgresql npgsql optimistic-concurrency

3
推荐指数
2
解决办法
6712
查看次数

乐观并发控制澄清

我是 ES7 的新手,正在尝试了解乐观并发控制

我想我明白,当我获取请求一个文档并将其_seq_no_primary_term值在稍后的写入请求中发送到同一文档时,如果值不同,则写入将被完全忽略。

但是,在我不发送 和 _seq_no值的默认情况下,文档会发生什么情况_primary_term_seq_no即使它具有较旧的_primary_term值(因此使索引不一致),写入也会继续进行,还是仅在值较新时才被处理?

如果是前者,文档最终会保持一致吗?

我试图弄清楚我是否需​​要发送这些值以获得最终的一致性,或者我是否可以免费获得它而不发送这些值。

multithreading distributed-system eventual-consistency optimistic-concurrency elasticsearch

3
推荐指数
1
解决办法
1278
查看次数

ZooKeeper可以在一次操作中获取znode数据和znode数据版本(stat)吗?

我正在开发一个使用ZooKeeper作为数据存储区的应用程序.对于应用程序中的一个方法,我需要使用乐观并发控件.例如,我需要实现一个获取znode数据的get方法,并使用znode数据版本进行乐观并发控制检查.据我所知,无法在一次操作中获取znode数据和znode数据版本.如果存在更高争用更新znode数据,则get方法将无法工作,因为获取znode数据后znode数据可能会更改.所以我问 - 有没有一种方法可以在一次操作中获得znode数据和znode数据版本(或znode stat)而不会在其间进行任何锁定尝试?

optimistic optimistic-locking optimistic-concurrency apache-zookeeper

2
推荐指数
1
解决办法
1895
查看次数

Spring MVC:验证,重定向后获取,部分更新,乐观并发,现场安全

[这是我看到的关于Spring MVC的常见问题列表,它们以类似的方式解决.我在这里发布了它们,所以我可以从其他问题中轻松地引用它们]

如何仅使用表单更新模型实体的几个字段?

如何在Spring MVC中使用Post-Redirect-Get模式,尤其是表单验证?

如何保护我的实体中的某些字段?

如何实现乐观并发控制

spring-mvc post-redirect-get optimistic-locking optimistic-concurrency

2
推荐指数
1
解决办法
7183
查看次数

mongoDB更新乐观并发控制

我正在模拟multiple concurrent requestMongoDB 的“更新”。

\n\n

事情是这样的,我amount=1000在 mongoDB 中插入一条数据,每次触发 api 时,它都会更新金额并将amount += 50其保存回数据库。基本上它是一个find and update对单个文档的操作。

\n\n
    err := globalDB.C("bank").Find(bson.M{"account": account}).One(&entry)\n\n    if err != nil {\n        panic(err)\n    }\n\n    wait := Random(1, 100)\n    time.Sleep(time.Duration(wait) * time.Millisecond)\n\n    //step 3: add current balance and update back to database\n    entry.Amount = entry.Amount + 50.000\n    err = globalDB.C("bank").UpdateId(entry.ID, &entry)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里是该项目的源代码。

\n\n

我正在使用 Vegeta 模拟请求:

\n\n

如果我设置-rate=10(意味着一秒触发api 10次,所以1000 + 50 * 10 = 1500),数据是正确的

\n\n
echo\xc2\xa0"GET\xc2\xa0http://localhost:8000"\xc2\xa0|\xc2\xa0\\\nvegeta\xc2\xa0attack\xc2\xa0-rate=10\xc2\xa0-connections=1\xc2\xa0-duration=1s\xc2\xa0|\xc2\xa0\\\ntee\xc2\xa0results.bin\xc2\xa0|\xc2\xa0\\\nvegeta\xc2\xa0report\n …
Run Code Online (Sandbox Code Playgroud)

mongodb optimistic-concurrency

2
推荐指数
1
解决办法
6523
查看次数