我正在使用包装 SQL 语句的应用程序 (MapServer - http://mapserver.org/ ),以便 ORDER BY 语句位于内部查询中。例如
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
Run Code Online (Sandbox Code Playgroud)
该应用程序有许多不同的数据库驱动程序。我主要使用 MS SQL Server 驱动程序和 SQL Server 2008。如果在子查询中找到 ORDER BY,则会引发错误。
来自 MS Docs(虽然这适用于 SQL Server 2000,但它似乎仍然适用):
当您在视图、内联函数、派生表或子查询中使用 ORDER BY 子句时,它不保证有序输出。相反,ORDER BY 子句仅用于保证由 Top 运算符生成的结果集具有一致的构成。ORDER BY 子句仅在最外面的 SELECT 语句中指定时才保证有序的结果集。
但是,在 Postgres (9) 和 Oracle 中运行时,相同类型的查询会返回结果 - 其顺序与子查询中定义的顺序相同。在 Postgres 中,查询计划显示结果已排序,并且 Postgres 发行说明包括暗示使用子查询顺序的项目:
当子查询 ORDER BY 匹配上查询时避免排序
http://en.wikipedia.org/wiki/Order_by指出:
尽管一些数据库系统允许在子选择或视图定义中指定 ORDER BY 子句,但存在没有影响。
但是,从我自己对查询计划的检查来看:
无论我读过 CAP 还是 ACID,我都看到一致性被用来确保 DB 完整性约束。所以,我不明白,为什么用两个术语来指代同一件事,或者完整性和一致性之间存在差异?
我读到了
总之,原子性、一致性、隔离性、持久性是事务的属性。确实,原子性+隔离性足以让您滚动自己的一致性。但是我们也可以滚动我们自己的原子性,滚动我们自己的隔离,滚动我们自己的持久性(durability)。当我们推出自己的产品时,我们必须用自己的血汗和括号为功能买单。我们并没有说这些属性是由交易系统提供给我们的。
这表明一致性是用户应用程序可以在数据库完整性约束之上提供的东西。这不是由数据库提供的属性,因为 AID 属性是。为什么要像对系统提供的其他 AID 属性一样给 C 标题?
我有以下数据库设计(通过=>外键约束描述):
公司[编号] CompanyRealm[id, company_id=>Company.id] many2many 项目[id, company_id=>Company.id] ProjectRealm[id, project_id=>Project.id, company_realm_id=>CompanyRealm.id] many2many
问题是提供的数据库设计允许不一致的数据。例如:
公司1 (id= 1 ) 公司 2(id= 2 ) CompanyRealm(id=11, company_id= 1 ) 项目(id=33, company_id= 2 ) ProjectRealm(id=44, project_id=33, company_realm_id=11)
(Company可以有很多Realms,Project属于Company可以涉及任意数量的公司的Realms)
ProjectRealm 指的是两个不同的公司:
我的数据库设计有问题吗?
如果是 - 违反了哪些处方?
如果否 - 如何防止错误的数据插入(通过约束?触发异常?)
为了更好地设计数据库,我注意到我总是被困在试图解决完全相同问题的变体中。
以下是使用常见要求的示例:
product.food和furniture。order历史记录。expiration_date和calories任何food产品和manufacture_date任何furniture产品。如果不是需求 4,模型可能非常简单:
问题是试图解决需求 4。我想到了这样的事情:
在这种方法中,关系product-furniture和product-food是超类型-子类型(或超类-子类)关联;子类型的主键也是超类型主键的外键。
但是,这种方法不能保证category通过外键引用的product将与其实际子类型一致。例如,没有什么能阻止我将foodcategory设置为Furniture表中具有子类型行的产品元组。
我阅读了有关建模关系数据库中的继承的各种文章,尤其是这篇和这篇非常有帮助但由于上述原因没有解决我的问题的文章。但是无论我使用什么模型,我都不会对数据一致性感到满意。
如何在不牺牲数据一致性的情况下解决需求 4?我在这里做错了吗?如果是这样,根据这些要求解决此问题的最佳方法是什么?
跑步:
DBCC CHECKDB(DatabaseName) with NO_INFOMSGS
Run Code Online (Sandbox Code Playgroud)
给了我以下错误:
消息 824,级别 24,状态 2,第 1 行
SQL Server 检测到基于逻辑一致性的 I/O 错误:pageid 不正确(预期为 1:7753115;实际为 0:0)。它发生在读取文件 'K:\UAT Databases\dbname.MDF' 中数据库 ID 11 中偏移量 0x00000ec9b36000 的页面 (1:7753115) 期间。SQL Server 错误日志或系统事件日志中的其他消息可能会提供更多详细信息。这是威胁数据库完整性的严重错误情况,必须立即纠正。完成完整的数据库一致性检查 (DBCC CHECKDB)。此错误可能由多种因素引起;有关详细信息,请参阅 SQL Server 联机丛书。
我还在dbo.suspect_pages 中找到了一个条目
请指教。
假设使用 SQL Server 备份命令(内部创建.bak文件)将SQL Server 实例或数据库级备份到 NAS 共享或磁带是事务一致的备份是否安全?
在备份到共享驱动器的过程中,您的数据库可以在线。这种类型的备份如何保证应用程序的一致性?
我将这种备份与 VSS 感知硬件级快照以及使用第三方工具的备份选项进行比较,该工具声称 100% 应用程序一致备份。VSS 执行诸如冻结 IO 直到快照完成等操作。
SQL Server 本机备份如何在没有 VSS 的情况下保持其一致性?
我在网上读了很多文章,但仍然很困惑为什么 Mongo CP、Cassandra AP、RDBMS CA ?将解释我的理解和疑问。
蒙戈
考虑这样一个场景,我有一个主人和两个奴隶。考虑
根据我的理解,由于步骤 3 和 4,Mongo 被称为 CP,其中 C 代表最终一致。正确的 ?
卡桑德拉
这里没有主/从模型,每个节点根据分片键接收其共享的写入和读取请求。
步骤 4 解释了为什么 cassandra 具有高可用性,但步骤 5 也描述了其最终一致性。因此,根据我的理解,cassandra 提供了最终一致性和可用性。那为什么说它不提供一致性呢?
mongodb partitioning cassandra high-availability consistency
到目前为止,我读过的所有谈论事务的书籍都展示了涉及多个 SQL 语句的场景。
但是单个语句又如何呢?他们的隔离程度如何?标准中是否有指定?或者它取决于 RDBMS 和隔离级别?
让我举几个例子。
UPDATE table SET value = value + 1 WHERE id = 1;
这是一个复合read-update-write操作。read并行事务可以改变和write操作之间的值吗?有些书指出,在大多数RDBMS中,此操作是原子的(在多线程编程意义上) 。
SELECT * FROM table t1 JOIN table t2 USING (id);
如果表很大(或者查询会有一些复杂的过滤子句),在某些隔离级别上,列t1.*和t2.*列是否可能因并行更新而有所不同?
SELECT * FROM table1 WHERE id IN (SELECT t_id FROM table2);
table1执行子选择后是否有可能删除一些记录?(这里我假设table2.t_id引用table1.id具有级联删除功能。)
热膨胀系数...
还可以提供有用手册的链接,这些手册充分解释了交易的所有细节。
“可序列化”意味着对于任何给定的并发事务集,这些事务的串行排序会产生相同的结果。
他们还举了一个例子
假设您有一个初始值为 10 的属性;你有两笔交易——一笔使价值翻倍,另一笔增加了七笔。两个不同的客户端发起两个事务。在孤立语义下,该属性唯一可接受的值是 27(先加倍后加 7 的结果)和 34(先加 7 后加倍的结果)。任何其他值(例如 20 或 17)都将是错误的。
在示例中我们有哪个“相同的结果”?我们必须进行哪些重新排序才能产生相同的结果?
最近我正在学习事务数据库中的并发控制技术。但是,我对操作系统和事务数据库中的并发控制之间的差异感到非常困惑。
在我的理解中,数据库文献中介绍的并发控制技术可以用在多线程程序中,它的线程彼此共享一些变量,反之亦然。多线程程序中用于在线程之间共享变量的技术也可用于数据库中的并发控制。
为什么我们要费心在数据库文献和操作系统中以不同的方式介绍这一点?
consistency ×10
concurrency ×2
constraint ×2
sql-server ×2
terminology ×2
transaction ×2
backup ×1
cassandra ×1
dbcc-checkdb ×1
foreign-key ×1
mongodb ×1
order-by ×1
partitioning ×1
subtypes ×1