我想乐观地“锁定”一段代码。伪代码如下:
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 都是原子的。你觉得这种方法有什么问题吗?
我正在将SQL Server数据库架构迁移到MySQL.SQL Server上的某些表有一个rowversion类型的列.这是在首次插入行时设置的整数值,然后每次更新行的任何列时再次设置.该数字只会递增.
我们利用它来检查并发问题.因此,当插入到服务器时,我们可以检查传入值是否与当前存储值不同.如果是这样,那么自从导致此插入的读取以来,该行已被更新.然后我们可以拒绝更新,因为它基于过时的值.乐观并发.
在MySQL中是否存在对我们相同的等价物?
我正在使用实体框架开发一个Web应用程序.我加载一个对象列表并将其绑定到转发器以显示所有项目的摘要.用户可以单击转发器中的每个项目的编辑图标或删除图标.
例:
第1项| 编辑| 删除
第2项| 编辑| 删除
...
使用rowversion列进行并发时,编辑工作正常,因为加载了记录,ID和rowversion列的值保存在隐藏的表单字段中.然后,这些"原始"值可用于稍后进行更新时使用.
但是,如果用户单击Delete作为记录,我从数据库加载对象,调用DeleteObject(),然后调用SaveChanges().这个问题是当我加载记录时,它获取最新的rowversion值,因此任何并发检查都是无用的.
如何确保在删除记录时进行并发检查?
asp.net concurrency entity-framework optimistic-concurrency entity-framework-4
我正在使用c#和asp.net为我的网站创建一个论坛系统,对于数据访问,我使用的是类型化数据集,对于UI,我正在使用mvp模式.在我的数据库中,我有存储过程,我已添加到我的数据集中.问题是数据集不允许我选择"使用乐观并发"复选框,所以我必须自己实现乐观并发.我已经为我的表添加了一个时间戳列,现在我遇到了为每个用户保存此值的问题!那么什么状态管理方法是安全的,并且用于保存时间戳值的成本更低?
我想也许最好使用session来存储值,但是如果用户的数量增加,我会遇到内存资源问题但是我可以设置会话使用sql server而不是内存但我不知道会慢多少所以我无法决定.
任何帮助是赞赏的家伙!
编辑1:是的.我想跟踪行的最后一次修改,看它是否与用户拥有的那个匹配.但我不知道在哪里保存用户的时间戳值.
我想通过使用乐观锁定来处理并发执行.我@Version在我的实体类中包含了注释.
在我的代码中,我同时运行两个线程.有时它正确执行.有时它是投掷org.eclipse.persistence.exceptions.OptimisticLockException和javax.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
我正在寻找一种方法来管理 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 每当更新行时,触发器都会自动递增。
客户端应用程序执行以下操作:
master表中读取记录。detail根据步骤 2 中的逻辑向表中插入一条记录。如果master.row_version自从在第 1 步读取记录后的值发生了变化,我希望第 3 步被拒绝。在我看来,乐观并发控制是正确的答案(唯一的答案?),但我不确定如何管理它两张这样的桌子。
我在想 Postgres 中的一个函数在表中的相关记录上有一个行级锁master可能是要走的路。但我不确定这是否是我最好的/唯一的选择,或者它会是什么样子(我对 …
我是 ES7 的新手,正在尝试了解乐观并发控制。
我想我明白,当我获取请求一个文档并将其_seq_no和_primary_term值在稍后的写入请求中发送到同一文档时,如果值不同,则写入将被完全忽略。
但是,在我不发送 和 _seq_no值的默认情况下,文档会发生什么情况_primary_term?_seq_no即使它具有较旧的_primary_term值(因此使索引不一致),写入也会继续进行,还是仅在值较新时才被处理?
如果是前者,文档最终会保持一致吗?
我试图弄清楚我是否需要发送这些值以获得最终的一致性,或者我是否可以免费获得它而不发送这些值。
multithreading distributed-system eventual-consistency optimistic-concurrency elasticsearch
我正在开发一个使用ZooKeeper作为数据存储区的应用程序.对于应用程序中的一个方法,我需要使用乐观并发控件.例如,我需要实现一个获取znode数据的get方法,并使用znode数据版本进行乐观并发控制检查.据我所知,无法在一次操作中获取znode数据和znode数据版本.如果存在更高争用更新znode数据,则get方法将无法工作,因为获取znode数据后znode数据可能会更改.所以我问 - 有没有一种方法可以在一次操作中获得znode数据和znode数据版本(或znode stat)而不会在其间进行任何锁定尝试?
optimistic optimistic-locking optimistic-concurrency apache-zookeeper
[这是我看到的关于Spring MVC的常见问题列表,它们以类似的方式解决.我在这里发布了它们,所以我可以从其他问题中轻松地引用它们]
如何仅使用表单更新模型实体的几个字段?
如何在Spring MVC中使用Post-Redirect-Get模式,尤其是表单验证?
如何保护我的实体中的某些字段?
如何实现乐观并发控制?
spring-mvc post-redirect-get optimistic-locking optimistic-concurrency
我正在模拟multiple concurrent requestMongoDB 的“更新”。
事情是这样的,我amount=1000在 mongoDB 中插入一条数据,每次触发 api 时,它都会更新金额并将amount += 50其保存回数据库。基本上它是一个find and update对单个文档的操作。
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)\nRun Code Online (Sandbox Code Playgroud)\n\n这里是该项目的源代码。
\n\n我正在使用 Vegeta 模拟请求:
\n\n如果我设置-rate=10(意味着一秒触发api 10次,所以1000 + 50 * 10 = 1500),数据是正确的
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) asp.net ×2
c# ×1
concurrency ×1
eclipselink ×1
jpa ×1
locking ×1
mongodb ×1
mysql ×1
npgsql ×1
optimistic ×1
postgresql ×1
python ×1
redis ×1
rowversion ×1
spring-mvc ×1
sql-server ×1