【问题标题】:Multiple access to database. How to prevent separate threads from modifying the same data?多次访问数据库。如何防止不同的线程修改相同的数据?
【发布时间】:2013-06-07 18:16:31
【问题描述】:

该应用程序将安装在最多 10 台机器上,其中一台也将用作服务器。一个与服务器永久同步的相同 DataGridView 将在所有这些视图上打开。不同的“用户”将有不同的修改权限等。例如,他们都可以删除表中的行,但只有创建行的人才能修改它等。 我目前在服务器上使用 SQLite。显然,我需要使用 C#-s 套接字连接功能将客户端与服务器连接起来。 问题是,在某些时候,其中一个客户端将尝试访问(例如删除)当前正在被另一个客户端修改的行。这可能会导致很多问题。据我所知,有一种称为数据库锁定和 的技术,它使您能够限制客户端对数据库的访问。 我的问题是: 在进行更改时锁定数据库是否方便?例如,将尝试访问数据库的函数会一次又一次地尝试这样做(在一种循环中),直到它看到它可以修改数据库。那会奏效吗? 有没有更好的解决方案? 也许其他一些数据库提供类似于查询堆叠的东西以实现多访问?

不知道我是否说清楚了。如果需要任何其他信息才能理解此问题,请发表评论。

【问题讨论】:

  • 不了解 SQLite,但大多数数据库都有缓解并发问题(通常使用行锁)。您还可以在代码中实现锁定块,或者使用 Semaphore 类查看更多可定制的用法。

标签: c# mysql sqlite locking


【解决方案1】:

对于初学者来说(因为我在 MySQL 标记中看到了这一点)这里是相关的 MySQL 手册页:http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html,在这种情况下只是做

LOCK TABLES someTableName WRITE;
...
UNLOCK TABLES;

特别是使用 SQLite,我发现了这个 SO 问题 Explicit locking mechanism in SQLite,以这个例子为例,你会看到类似的东西

BEGIN EXCLUSIVE TRANSACTION;
...
COMMIT TRANSACTION;

但是它也提到将锁定整个数据库,而不仅仅是有问题的表。 SQLite 文档的答案中包含的链接是http://sqlite.org/lang_transaction.html

总体而言,SQLite 可能不是您使用的最佳数据库,因为锁定整个数据库可能会造成相当大的瓶颈。如果可行的话,可能值得研究另一个能够更好地应对的数据库服务器,例如 MySQL。

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多