在我的生产错误日志中,我偶尔会看到:
SQLSTATE [HY000]:常规错误:1205超出锁定等待超时; 尝试重新启动事务
我知道当时哪个查询正在尝试访问数据库,但有没有办法找出哪个查询在那个精确时刻有锁定?
我不是数据库专家,也没有正式的计算机科学背景,所以请耐心等待.我想知道如果你使用v4之前的旧版MongoDB,可能会发生现实世界的负面情况,这些版本不符合ACID标准.这适用于任何ACID不合规数据库.
我知道MongoDB可以执行Atomic Operations,但它们不支持"传统锁定和复杂事务",主要是出于性能原因.我也理解数据库事务的重要性,以及数据库何时用于银行的示例,并且您正在更新所有需要同步的多个记录,您希望事务恢复到初始状态(如果有)停电所以信贷等于购买等
但是当我开始讨论MongoDB时,我们这些不了解数据库实际实现方式的技术细节的人开始抛出以下语句:
MongoDB比MySQL和Postgres更快,但是有一个很小的机会,比如百万分之一,它"无法正确保存".
"无法正确保存"部分指的是这样一种理解:如果在您写入MongoDB的那一刻就出现断电,那么就有机会获得特定记录(比如你在跟踪具有10个属性的文档中的综合浏览量)每个),其中一个文件只保存了5个属性...这意味着随着时间的推移,你的网页浏览计数器将"略微"关闭.你永远不会知道多少,你知道他们将是99.999%正确,但不是100%.这是因为,除非您特意将其作为mongodb原子操作,否则操作不能保证是原子操作.
所以我的问题是,对于何时以及为什么MongoDB可能无法"正确保存"的正确解释是什么?ACID的哪些部分不满足,在什么情况下,以及您如何知道0.001%的数据何时关闭?不能以某种方式解决这个问题吗?如果没有,这似乎意味着您不应该users在MongoDB中存储像表这样的内容,因为记录可能无法保存.但话说回来,1/1,000,000用户可能只需要"再次尝试注册",不是吗?
我只是在寻找一个列表,列出了何时/为什么会出现像AIOD不合规数据库(例如MongoDB)的负面情况,理想情况下是否有标准的解决方法(比如运行后台作业来清理数据,或者只使用SQL等等) .
ACID和数据库事务之间有什么关系?
ACID是否提供数据库事务还是同样的事情?
有人可以启发这个话题.
澄清问题:
当OS发送命令将扇区写入磁盘时它是原子的吗?即,如果电源在写入命令之后立即失败,则新数据的写入将完全成功或旧数据保持不变.我不关心多扇区写入会发生什么 - 撕裂的页面是可以接受的.
老问题:
假设您在磁盘上有旧数据X,您在其上写入新数据Y,并且在写入期间树落在电源线上.如果没有花哨的UPS或备用电池的磁盘控制器,最终可能会出现页面撕裂的情况,磁盘上的数据是X部分和Y部分.您是否最终会遇到磁盘上的数据是X部分,Y部分的情况和部分垃圾?
我一直在努力理解像数据库这样的ACID系统的设计,而且我的天真想法似乎是firebird,它不使用预写日志,依赖于给定的写入不会破坏旧数据(X) - 只能完全写入新数据(Y).这意味着如果要覆盖X的一部分,则只能更改被覆盖的X部分,而不是我们打算保留的部分X.
为了澄清,这意味着如果你有一个页面大小的缓冲区,说4096个字节,充满了一半Y,一半X,我们要保持 - 我们告诉OS编写过X该缓冲区,有严重的磁盘的任何事都不短在写入期间我们想要保留的半X被破坏的失败.
我有一个小的,一行更改(修改字符串中的拼写错误),我想尽快部署到我们的生产SQL Server 2005服务器的存储过程.
我担心的是如果在确切的时间运行alter语句来更新我的存储过程会发生什么事情,它会发生同时调用该存储过程的事情?
它是使用存储过程的先前副本运行的,还是会导致某些损坏或错误?
考虑到SQL Server的ACID性质,我希望它是安全的.它在同一时间运行的可能性,特别是因为SP非常小,非常低,但我更愿意确定,而且我也对答案感兴趣,仅用于教育目的.
可以说,ServerFault会是一个更好的地方,对不起,如果错误的话.
谢谢.
两个锁定读取子句之间的确切区别是什么:
SELECT ... FOR UPDATE
Run Code Online (Sandbox Code Playgroud)
和
SELECT ... LOCK IN SHARE MODE
Run Code Online (Sandbox Code Playgroud)
为什么你需要使用一个而不是另一个?
Oracle,SQL Server等数据库非常擅长数据完整性.如果我想编写一个我知道会存储一些数据或失败的数据存储(即ACID),那么我会在它下面使用像MySQL这样的数据库作为实际商店,因为这些问题已经解决了.
然而,作为一名非综合性学生,我不知道ACID 究竟是如何在非常低的水平上运作的.我知道Oracle就是这样,一直将数据写入"在线重做日志",然后在应用程序发出应该提交事务的信号时执行"提交".
正是这个"提交"阶段,我想直接放大并理解.是仅仅将"一个字节"写入磁盘,还是将a翻转0到a 1表示已成功存储给定行的情况?