MSSQL 多用户访问
Posted
技术标签:
【中文标题】MSSQL 多用户访问【英文标题】:MSSQL multi-user access 【发布时间】:2014-01-31 09:38:57 【问题描述】:我在使用 MSSQL 实例时遇到问题,有时会出现死锁。我有一个表 A,其中包含温度测量值。我的应用程序包含 1-10 个工作线程,它们通过 TCP 从远程位置收集测量值,然后希望将它们存储在数据库中。当然,这些工人使用交易来执行他们的任务。事务的 IsolationLevel 设置为 ReadCommitted。仍然会发生死锁,并且数据库服务器的 CPU 负载达到 100%。谁能告诉我,我必须考虑什么才能让这个工作?我以为数据库系统会为我做多用户同步。至少这是我在大学学到的。
【问题讨论】:
该大学还教导说,死锁是数据库确保“多用户同步”的后果。阅读Detecting and Ending Deadlocks。您在Table A
上缺少索引。
【参考方案1】:
我的建议是创建另一个线程来处理您对数据库的更新。因此,以线程安全的方式将信息添加到线程的集合中,并让 1 个工作线程对表进行更新/插入。您甚至可以连接 10-30 条这样的语句并一起执行。
这就是我们在 SMS Sender 上所做的,我们使用了多达 50 个线程,每个线程每 100 毫秒发送一条 SMS 一条 SMS。它对我们非常有效。
【讨论】:
这个完全一样,我想出来的。但我还有另一个应用程序将存储的数据作为网络服务提供服务...... 这很可能是你得到死锁的原因,因为你是从你更新的同一个表中选择的。当您从其他应用程序中进行选择时,添加WITH (NOLOCK)
或将您的隔离级别更改为未提交读。 (***.com/questions/686724/…)。如果您不从一侧回滚数据,并且在选择 web 服务时不从其他地方进行另一次更新,那么您应该没有问题。
考克斯,你不能两全其美。你必须决定什么是最重要的。您不必在编辑时锁定记录吗?工作线程是否再次更新这些相同的记录。如果没有,那么没有问题。阅读信息,对其进行操作,然后更新记录。否则,您需要围绕该问题重新考虑您的架构。
问题在于,我没有能力只锁定 我 想要的东西。正如我现在看到的情况,我只能提供一个带有 IsolationLevel 的事务,就是这样。锁由 NHibernate 或 .NET 魔术数据库框架获取。真的吗?在许多情况下,两个进程不会访问相同的数据,但是当他们访问时,我必须克服这个问题。如果 web 服务必须等待收集服务完成也没关系,但现在数据库系统只允许在这种情况下出现死锁。以上是关于MSSQL 多用户访问的主要内容,如果未能解决你的问题,请参考以下文章
附加了mssql2000数据库,怎么新建用户,而且要指定用户权限?