我有一个长时间运行的事务(称为 T1),它对 SQL Server 2008 R2 中的表执行一些删除、更新和插入操作。同时,另一个进程会定期从该表中运行 select 语句。
在默认隔离设置下(我认为是 READ COMMITTED?),T1 会阻止任何 select 语句运行,直到事务提交或回滚。
我希望看到的是,即使在事务正在进行时,select 语句也能对一致的数据起作用。我相信 SNAPSHOT 隔离可以提供帮助,但不确定我是否朝着正确的方向前进。这是该应用程序的最佳隔离级别吗?
其次,我无法控制调用 select 语句的进程,但我可以控制调用 T1 的 .NET 应用程序。select 语句和 T1 都需要更改任何隔离级别,还是仅将 T1 标记为具有不同的隔离级别就足够了?
我在 postgres-8.4 中有一个简单的博客数据库,它有两个表,articles和comments. 我有一个查询(由 Django 生成),想要获取类型为“NEWS”的最新文章并查找该文章的评论数量。它通过以下查询做到这一点:
SELECT "articles"."id", "articles"."datestamp", "articles"."title", "articles"."shorttitle", "articles"."description", "articles"."markdown", "articles"."body", "articles"."idxfti", "articles"."published", "articles"."type", COUNT("comments"."id") AS "comment__count"
FROM "articles"
LEFT OUTER JOIN "comments" ON ("articles"."id" = "comments"."article_id")
WHERE ("articles"."type"='NEWS')
GROUP BY "articles"."id", "articles"."datestamp", "articles"."title", "articles"."shorttitle", "articles"."description", "articles"."markdown", "articles"."body", "articles"."idxfti", "articles"."published", "articles"."type"
ORDER BY "articles"."datestamp" DESC
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
这些表都不是特别大,但该查询需要 46 毫秒。执行计划是:
Limit (cost=119.54..119.58 rows=1 width=1150) (actual time=46.479..46.481 rows=1 loops=1)
-> GroupAggregate (cost=119.54..138.88 rows=455 width=1150) (actual time=46.475..46.475 rows=1 loops=1)
-> Sort (cost=119.54..120.68 rows=455 width=1150) (actual …Run Code Online (Sandbox Code Playgroud) 我有一个 MSSQL (MSSQL 2008 R2) 集群以一种我无法恢复的方式失败(长话短说,服务器最终陷入 BSOD 循环,我责怪 Broadcom 和我自己)。
我有 SQL 备份,更好的是,我有分离的 MDF 和 LDF 文件,因为它们在一切都出错之前就在 SAN 上。我现在的任务是将这些恢复到新建的服务器。
数据库本身、登录名和 SSIS 包都不是问题,因为我已经掌握了所有这些。困扰我的是在以前的服务器上定义的 SQL 代理作业。我隐约知道这些文件存储在 MSDB 的某个地方,但是我应该通过哪些步骤从我已经获得的 MDF/LDF 文件中检索这些文件并将它们加载到新服务器上?
我不会在新服务器上恢复模态、msdb、master 和 temp 数据库,所以我应该寻找以不同名称附加旧文件并从中提取作业定义,还是有其他一些(更好) 道路?
我对以下场景的预期和实际行为有疑问。
该场景是[table1]每天清除并重新加载数据库表 ( )的场景。该表有一个id列被其他几个使用外键的表引用。如果我将外键ON DELETE操作设置为CASCADE,显然如果我DELETE FROM [table1]在该表上发出单个命令,这将删除其他表中的行。但是,如果我要删除所有行,然后在同一事务下重新插入具有相同 ID 的相同行,会发生什么情况?这会触发级联中间事务,还是会在我调用 commit 后进行外键协调?
显然,我在这里考虑的是 SQL Server,但我想知道这种行为在其他数据库中是否也一致。
如果即使在事务中间也触发级联,那么管理外键和与每天完全清除并重新加载的表的关系的最佳方法是什么?
sql-server ×2
transaction ×2
foreign-key ×1
index ×1
locking ×1
performance ×1
postgresql ×1
restore ×1