【发布时间】:2011-11-28 08:19:25
【问题描述】:
我目前正在使用 Entity Framework 4.1 和 MySQL 开发应用程序。我想使用乐观并发,因此需要创建一个允许 EF 检测并发问题的表结构。我的目标与此类似:http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity-framework.aspx。
我的问题是 MySQL 中的时间戳类型与 MS SQL Server 不同。除此之外,时间戳和日期时间都没有在 MySQL 中提供亚秒级精度(http://feedblog.org/2007/05/26/why-doesnt-mysql-support-millisecond-datetime-resolution/)。因此,这些类型在检测并发问题方面会非常糟糕。
我可以使用什么其他数据类型来解决这个问题?我在考虑也许使用Guid。但是这种方法有两个潜在的问题: 1. MySQL 将 Guid 存储为 char(36),这使得它们非常低效。 2. 我不确定 EF 是否需要严格增加行版本,或者它是否足够独特。
【问题讨论】:
-
系统有多复杂?例如,您能否使用预提交挂钩来增加行上的整数(如手动实现的、特定于行的
ROWVERSION)? -
所有插入和更新都通过相同的通用方法运行,因此我可以在那里增加行版本。但是,代码可能会在多台不同的机器上运行,因此很难在服务器之间进行同步。
-
您当然不必同步它;如果您要防范内部工作单元的更改,它应该已经是自动的;如果您在调用之间(在客户端)持有 rowversion,那么只需与您获取的记录上的 rowversion 进行比较...?
-
酷,我就是这么想的。我只是不确定如何在 EF 中实现并发检查。因此,唯一重要的是您可以在获取后检测更新,而此解决方案为您提供了这一点。即使上下文中更新的 rowversion 可能与数据库中同时更新的行的 rowversion 相同。我理解正确吗?
标签: c# .net mysql entity-framework concurrency