我正在使用锁和事务,就像VBA excel程序员第一次尝试编写多线程c ++服务器一样......
我试图向我的同事征求意见,但我们在设计复杂的数据库,编写快速有效的查询,在需要时使用索引和约束等方面都非常好(或者我们认为),等等我们都不熟悉这个话题。
我发现的所有在线资源都是语法参考或虚拟教程,解释事务以“begin tran”开头,以提交或回滚结束。
我也没有成功地浏览过。
我正在寻找的是一系列简单的现实世界问题,以及解决这些问题的正确方法。
示例:
假设我有一个带有一个Active位列的表,并且我不希望同时有两个活动行。当然,许多进程可以尝试同时插入数据。
或者写道:
更新tbFoo设置Active = 0 插入tbFoo(foo,Active)选择'foo',1不存在(从* tbFoo中选择*,其中Active = 1)
请不要评论/回答这个具体问题和我的愚蠢建议。我只想弄清楚我没有线索这一事实:)
在哪里可以找到关于简单但相关的锁定情况的一些好的演练?如果它有所作为,我正在使用SQL Server 2008
我也很想知道其他人是否有同样的感受。
答案 0 :(得分:1)
您需要深入了解产品特定文档才能理解这一点。
它是特定于产品的,在一个数据中起作用的东西在另一个数据中不起作用。也就是说,在大多数情况下,仔细选择隔离级别就足够了,只有当你开始真正推动事情时才需要更多地使用查询提示。
对于SQL Server,“内部SQL Server 2000”(MSPress)是我获得足够详细信息的地方,大部分时间我都不需要这种详细程度(并且还与拥有数十年Oracle专业化的人员合作)。 / p>
答案 1 :(得分:1)
当然,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服务器时的生活变得更轻松。
我知道这些天买书纸似乎几乎是怀旧的,但这是我推荐的,因为我发现很难在网上获得全面的指南!