Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGrid-防止对行的并发访问_C#_Java - Fatal编程技术网

C# DataGrid-防止对行的并发访问

C# DataGrid-防止对行的并发访问,c#,java,C#,Java,我需要编写一个简单的datagrid表单,允许用户编辑单元格-问题是不同的人可以在同一时间编辑单元格,因此并发性成为一个问题 我正在使用数据库支持的数据 我似乎有两个选择: 1) 在允许编辑之前,不断轮询数据库并刷新datagrid中的数据-这意味着数据库更新需要在编辑之后进行,而不是以允许编辑的首选方式进行,然后让用户查看并提交 2) 允许脏编辑,然后阻止用户向数据库提交他们想要的更改 有人能描述一种允许用户同时编辑行的机制吗?这将使实现变得简单 编辑:我的问题是如何在C#中实现这一点-我添加

我需要编写一个简单的datagrid表单,允许用户编辑单元格-问题是不同的人可以在同一时间编辑单元格,因此并发性成为一个问题

我正在使用数据库支持的数据

我似乎有两个选择:

1) 在允许编辑之前,不断轮询数据库并刷新datagrid中的数据-这意味着数据库更新需要在编辑之后进行,而不是以允许编辑的首选方式进行,然后让用户查看并提交

2) 允许脏编辑,然后阻止用户向数据库提交他们想要的更改

有人能描述一种允许用户同时编辑行的机制吗?这将使实现变得简单


编辑:我的问题是如何在C#中实现这一点-我添加了锁列,但这仍然不够-如果usera尝试编辑行1并提交更改,userB尝试编辑行1的旧版本,这将不会被发现,这是一个大问题

您有以下选项,但不限于:

乐观并发-假设可能存在并发 时不时的冲突,巨大的 大多数情况下,这类冲突 不会出现;因此,如果发生冲突 如果出现,只需通知用户即可 无法保存其更改 因为另一个用户修改了 相同数据

悲观并发-假设并发冲突是 普通的,用户不会 容忍别人告诉他们的变化 由于其他用户的错误,无法保存 并行活动;所以,什么时候? 一个用户开始更新记录, 锁定它,从而防止任何其他 禁止用户编辑或删除该文件 记录,直到用户提交其 修改

有关参考和详细信息,请参见:


乐观并发

PeopleDataContext people = new PeopleDataContext();     
Person p = people.People.Single(person => person.ID == 1);     
p.IDRole = 2;

try
{ people.SubmitChanges(ConflictMode.ContinueOnConflict); }

catch (ChangeConflictException cce)
{ people.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges); }
PeopleDataContext people = new PeopleDataContext();

using (TransactionScope t = new TransactionScope())
{
   Person p = people.People.Single(person => person.ID == 1);

   p.LastName = "Pessimistic";
   p.FirstName = "Concurrency";    

   people.SubmitChanges();     
   t.Complete();
}
悲观并发

PeopleDataContext people = new PeopleDataContext();     
Person p = people.People.Single(person => person.ID == 1);     
p.IDRole = 2;

try
{ people.SubmitChanges(ConflictMode.ContinueOnConflict); }

catch (ChangeConflictException cce)
{ people.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges); }
PeopleDataContext people = new PeopleDataContext();

using (TransactionScope t = new TransactionScope())
{
   Person p = people.People.Single(person => person.ID == 1);

   p.LastName = "Pessimistic";
   p.FirstName = "Concurrency";    

   people.SubmitChanges();     
   t.Complete();
}
参考:



实现乐观锁定的一种简单方法是向表中添加行版本列。(如果您的数据库服务器支持,请参见。)

当用户加载记录进行编辑时,获取记录的行版本

当用户试图保存其更新时,再次获取记录的行版本,并将其与用户编辑的记录的版本进行比较。如果它们不匹配,则使更改失败,并向用户解释发生了什么

您可以在多个位置执行第二步—在业务层、触发保存的事件处理程序或用于更新记录的存储过程中

(如果您的数据模型在结构上与您提供给用户的数据模型不同,那么这会变得更加复杂,但这并不是一个不可逾越的障碍。)

悲观锁定从来没有这么简单。引用一个很好的答案:

[悲观锁定]要求您 小心你的申请 设计以避免死锁。使用 悲观锁定您需要 直接连接到数据库(如图所示) 通常情况下,在两个 层客户端服务器应用程序)或 外部可用事务ID 可以独立于 连接


您还需要为悲观锁实现超时机制,以便疏忽的用户不能无限期地锁定记录。

这是学术性的-请参阅我上面的编辑,了解问题的含义。现在请检查,希望这有助于我们沿着悲观锁的路线前进,那么在其他用户提交更改后会发生什么?您必须要求用户刷新其datagrid以获取这些更改。现在我的数据库中有一个锁列和一个行版本id!!Thsi应该更容易