我有两个服务器运行相同的查询,检查单个共享数据库中的特定值。如果查询找到值,它将改变这些值。同时,其他服务器可能会运行相同的查询,并且在尝试更改信息时会出现某种冲突。
问题:我如何才能最好地配置服务器不会同时运行查询并保证它们不会发生冲突?
答案 0 :(得分:3)
数据库会自动为您解决此问题。他们使用锁来确保一次只有一个查询访问特定数据。这些锁不必应用整个表;根据查询和事务类型,也可以进行每行锁定。如果您有两个应该组合在一起的查询,例如您的选择和更新,事务,请确保在两个查询完成之前不会释放第一个查询中的锁。
通常,数据库旨在快速提供查询(并释放其锁定),以便按顺序处理大约在同一时间到达的两个查询,对最终用户几乎没有可观察到的延迟。锁可能会导致需要锁定大量数据的查询出现问题,需要长时间运行,或者当两个事务开始锁定不相关的数据但后来都需要另一个锁定数据时。这被称为死锁。
可以通过调整事务隔离级别来控制锁的问题。但是,搞乱隔离级别通常是错误的。大多数情况下,默认设置将执行您所需的操作,并且在不完全理解您正在执行的操作的情况下弄乱隔离级别会使情况变得更糟,并允许查询返回过时或错误的数据。
答案 1 :(得分:1)
交易和隔离级别是您的朋友。您需要设置隔离级别,以免他们干扰。
有关您需要设置的级别的指导,请参阅https://msdn.microsoft.com/en-gb/library/ms173763.aspx。
答案 2 :(得分:0)
您需要在数据库ex中有一个额外的列。 SERVER_ID。并写一个查询:
select * from database where server_id = 1 --for the first server
select * from database where server_id = 2 --for the second server