我在哪里可以找到关于SQL锁定和事务策略的良好介绍

时间:2009-02-26 22:45:45

标签: sql sql-server transactions locking

我正在使用锁和事务,就像VBA excel程序员第一次尝试编写多线程c ++服务器一样......

我试图向我的同事征求意见,但我们在设计复杂的数据库,编写快速有效的查询,在需要时使用索引和约束等方面都非常好(或者我们认为),等等我们都不熟悉这个话题。

我发现的所有在线资源都是语法参考或虚拟教程,解释事务以“begin tran”开头,以提交或回滚结束。

我也没有成功地浏览过。

我正在寻找的是一系列简单的现实世界问题,以及解决这些问题的正确方法。

示例:

假设我有一个带有一个Active位列的表,并且我不希望同时有两个活动行。当然,许多进程可以尝试同时插入数据。

  • 我应该锁定整张桌子吗?
  • 或者可能使用数据约束,以便插入第二个“活动”行会失败?
  • 或使用具有可重复读隔离级别的事务?
  • 或者写道:

    更新tbFoo设置Active = 0 插入tbFoo(foo,Active)选择'foo',1不存在(从* tbFoo中选择*,其中Active = 1)

请不要评论/回答这个具体问题和我的愚蠢建议。我只想弄清楚我没有线索这一事实:)

在哪里可以找到关于简单但相关的锁定情况的一些好的演练?如果它有所作为,我正在使用SQL Server 2008

我也很想知道其他人是否有同样的感受。

3 个答案:

答案 0 :(得分:1)

您需要深入了解产品特定文档才能理解这一点。

它是特定于产品的,在一个数据中起作用的东西在另一个数据中不起作用。也就是说,在大多数情况下,仔细选择隔离级别就足够了,只有当你开始真正推动事情时才需要更多地使用查询提示。

对于SQL Server,“内部SQL Server 2000”(MSPress)是我获得足够详细信息的地方,大部分时间我都不需要这种详细程度(并且还与拥有数十年Oracle专业化的人员合作)。 / p>

答案 1 :(得分:1)

Q&A from Chas Boyd

Kalen Delaney article

当然,good old BOL

对于SQL 2008,您可以使用MERGE来实现更新并在一个transaction.safe语句中插入。 我还没用过它所以我会做其中一个:    - 事后检查的触发器(因此它在同一事务中)    - MERGE的TABLOCKX锁定

在这种情况下,check this thread(和my answer当然:)

答案 2 :(得分:1)

在我看来,如果您真的需要了解SQL服务器中的锁和事务如何工作,最好的办法是找出SQL Server引擎如何在内部工作。

我发现“InsideMicrosoft®SQLServer®2008:T-SQL Programming”这本书是最全面的指南。

“处理事务,并发和错误处理”部分可以帮助您解决您遇到的具体问题。

然而,我发现我从本书的所有部分学到了很多小块,所有这些都让我在处理SQL服务器时的生活变得更轻松。

我知道这些天买书纸似乎几乎是怀旧的,但这是我推荐的,因为我发现很难在网上获得全面的指南!