多次访问数据库。如何防止单独的线程修改相同的数据?

时间:2013-06-11 19:09:23

标签: c# mysql sqlite locking

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

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

1 个答案:

答案 0 :(得分:1)

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

LOCK TABLES someTableName WRITE;
...
UNLOCK TABLES;

有了SQLite,我发现了这个问题Explicit locking mechanism in SQLite,举个例子,你会看到像

这样的东西
BEGIN EXCLUSIVE TRANSACTION;
...
COMMIT TRANSACTION;

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

总的来说,听起来好像SQLite可能不是您使用的最佳数据库,因为锁定整个数据库可能会造成相当大的瓶颈。如果可行,可能值得调查另一个数据库服务器,如MySQL,它能够更好地应对。