标签: acid

ACID和CAP定理的一致性,它们是一样的吗?

根据我的理解,ACID 的一致性就是保证数据的完整性。

但是,CAP 中的一致性意味着数据可以在分布式系统中快速出现。

这是否意味着:它们不是同一个概念?

distributed-databases acid

20
推荐指数
2
解决办法
2万
查看次数

使用触发器进行同步

我有一个类似于之前讨论的要求:

我有两张桌子,[Account].[Balance]并且[Transaction].[Amount]

CREATE TABLE Account (
      AccountID    INT
    , Balance      MONEY
);

CREATE TABLE Transaction (
      TransactionID INT
     , AccountID    INT
    , Amount      MONEY
);
Run Code Online (Sandbox Code Playgroud)

当对[Transaction]表进行插入、更新或删除操作时,[Account].[Balance]应根据[Amount].

目前我有一个触发器来完成这项工作:

ALTER TRIGGER [dbo].[TransactionChanged] 
ON  [dbo].[Transaction]
AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
IF  EXISTS (select 1 from [Deleted]) OR EXISTS (select 1 from [Inserted])
    UPDATE [dbo].[Account]
    SET
    [Account].[Balance] = [Account].[Balance] + 
        (
            Select ISNULL(Sum([Inserted].[Amount]),0)
            From [Inserted] 
            Where [Account].[AccountID] = [Inserted].[AccountID]
        )
        - …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server transaction acid data-synchronization

11
推荐指数
1
解决办法
5159
查看次数

当另一半失败时,交易的一半完成?

我在 SO、MSDN 和其他各种来源上进行了一些搜索,发现了很多关于事务的问题,但似乎没有一个正是我正在处理的问题。

诚然,尽管我确实了解 ACID 和事务的概念,但我仍然是初级 DBA。我正在处理一个 SQL 脚本:

  1. 向 2 个不同的表添加一行,前提是这些值尚不存在
  2. 如果存在,则删除列
  3. 如果不存在则添加一列
  4. 更改 2 个生成动态 SQL 以构建报表查询的存储过程

上述所有操作都是独立工作的,并且在(我认为是)单个事务中包含时,它们也会协同工作。我试图理解的是,当事务的另一部分失败时,事务的“部分”如何完成(并可能提交)。

为简洁起见,假设我有名为“ProcessReport”和“RetrieveReport”的工作程序。这两个过程中的动态 SQL 都以“SELECT”开头,然后从那里开始构建。测试用例:

CREATE TABLE ReportTable (FirstName VARCHAR(100), LastName VARCHAR(100), OrderId INT);
GO
CREATE PROCEDURE ProcessReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql   
  SET @SQL = 'SELECT FirstName, LastName, '
  --create rest of dynamic SQL here...

  INSERT INTO ReportTable (FirstName, LastName) EXEC(@SQL)
END
GO 

CREATE PROCEDURE RetrieveReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql …
Run Code Online (Sandbox Code Playgroud)

t-sql transaction sql-server-2012 acid

4
推荐指数
1
解决办法
1486
查看次数

是否符合 Mysql ACID?

根据 Postgresql,Mysql 是否不符合 ACID?在一些博客中,我看到 Mysql 不符合 ACID。那有多真实?

在这里不要考虑复制,让我们考虑一个独立的,Mysql ACID 的效率如何?

在我对 Mysql-ACID 的理解中。

A - 原子性(如果一个事务失败必须回滚,则应提交所有事务集。是的意味着所有事务都已提交,不意味着即使失败也必须回滚)。

Mysql 中支持的 IE 特性有。

  • 开始交易;..... 犯罪 ;
  • auto_commit=1;

C - 一致性。

(PK,FK,UK,非空)。它遵守数据库的关系和约束。实例只有在删除其子键时才能删除父键。

我 - 隔离。用户与其提交状态之间的隔离。

读取可重复读取未提交读取已提交序列化

D - 耐用性。在数据库崩溃的事件中,innodb 通过从 iblog 文件中应用已提交的事务来恢复数据库并丢弃未提交的事务。

单击此处查看此问题的来源。 - 是因为博客是@2001 创建的吗?

2017 年 6 月 30 日更新:根据“Evan Carroll”的回复,我亲自测试了5.7.18-enterprise 上的博客实验。实验得到的结果好像是Mysql is Not an ACID Compliant。

mysql postgresql acid

4
推荐指数
2
解决办法
7004
查看次数

你能从 ACID 中删除一致性吗?

CJDate 在他的“数据库系统简介”一书中写了一个关于 ACID 原则的章节,称为“丢弃 ACID”。在这一章中,他称正确性(一致性)“本质上毫无意义”,而其他原则至多是“必要条件”。

这本书是 2004 年的,我在互联网上的任何地方都将 ACID 原则视为 RDBMS 应用程序编程的指导方针。这是否意味着 Date 对 ACID 的想法不被接受?或者从理论的角度来看,ACID 不像在阅读有关数据库编程的互联网文档时那样强制性?

我希望我的问题有意义并且在正确的论坛中。

acid

3
推荐指数
1
解决办法
866
查看次数

ACID 事务 innodb 中的行锁定

我有一个看起来像这样的金融交易(伪):

begin
    select record for update
    update record(same record as selected)
    insert another record into another table
commit
Run Code Online (Sandbox Code Playgroud)

如果我SELECT ... FOR UPDATE在事务中调用,是否只有在提交事务时才会释放特定行的锁?

mysql innodb acid

2
推荐指数
1
解决办法
2034
查看次数

Postgres:二级索引是否包含在 ACID 中?

是涵盖非唯一索引/指数ç在onsistency条款Ç ID?(对于不限制数据的索引的其他属性也是如此)我在 Postgres 中看到了某些性能问题(实际上是好处),这让我想知道它们是否存在。

鉴于索引/索引不是一流的对象(即您不能直接在 Postgres 中访问它们,也不能请求使用它们),我完全看不出为什么需要 Postgres 来支持这一点。我找不到 ACID 的定义说“索引必须完全完成并且在事务完成之前不能被黑客攻击”。

在某些不对插入设置限制的条件下(例如索引不是唯一的),索引本质上可能是“无效的”(即“在我完成重新索引之前不要使用它”),或者标志可以是设置表示“该索引不涵盖以下范围”。

如果 Postgres 使用这个技巧,copy from操作符可以变得非常迅速(这就是我所看到的),对于事务中的大量插入计数也是如此。

我不只是编造这个...

虽然红移是一个坏榜样,亚马逊黄鼠狼出Ç由捉弄它是如何存储的(唯一)排序键(基本上在红移主索引十岁上下结构)onsistency。在执行vacuum命令之前,主键只会变得越来越糟糕,您的数据库开始变成一个黑洞:查询进入,但没有结果出来。

显然,内部化的真空方案将防止在大规模进口期间经常发生的 Redshift 愚蠢行为。

postgresql performance acid postgresql-performance

2
推荐指数
1
解决办法
323
查看次数

Postgres 9.1 中的 ACID 违规?

我正在使用 Postgres DB 为大量计算机/进程实现作业调度。简而言之,每个作业都有其 id,所有调度都通过三个选项卡实现:所有作业、当前正在运行的作业和已完成的作业。

调度的关键功能是 (1) 请求作业和 (2) 通知 DB 已完成的作业。请求作业从作业列表中获取任何 id,它不在运行表中,也不在已完成表中:

insert into piper.jobs_running
select x.fid from ( 
  SELECT fid FROM piper.jobs
  except 
  select fid from piper.jobs_running
  except 
  select fid from piper.jobs_completed
 ) as x limit 1
returning(fid)
Run Code Online (Sandbox Code Playgroud)

完成作业会将其从运行列表中删除,并将其插入到已完成列表中。因为它不是特定于并发的,所以我省略了 SQL 命令(完成一项工作需要几十分钟到几个小时。)

对我来说,这是一个令人讨厌的惊喜,上面运行完全相同的查询的两个进程(几乎同时请求作业)可能会获得相同的作业 ID (fid)。我要提出的唯一可能的解释是 Postgres 不依赖 ACID 一致性。注释?

附加信息:我将事务设置为可序列化(在postgresql.conf 中 set default_transaction_isolation = 'serializable')。现在,如果隔离未完全填充,DBMS 会使事务失败。是否可以强制 Postgres 自动重新启动它们?

postgresql concurrency postgresql-9.1 acid except

1
推荐指数
1
解决办法
703
查看次数

如何处理每秒约 1k 次插入

假设每秒有大约 1k 个请求需要插入。

现在,互联网上对此有很多答案……但在这种特定情况下,它们在技术上是错误的。是的,几乎任何 RDBMS 都可以在标准硬件上每秒处理 1k 次插入,但如果且仅当您放弃 ACID 保证时。令人惊讶的是,互联网上有多少可怕的答案。例如“您可以随时扩展 CPU 和 RAM”,这应该可以每秒提供更多插入次数,但这不是它的工作原理。限制因素是磁盘速度或更精确:您实际上可以将多少事务刷新/同步到磁盘。这是棘手的一点。

在体面的“商品硬件”上(除非您投资于高性能 SSD),这就是您可以期待的:

  • SQLite:30 次插入/秒
  • MySQL:80 次插入/秒

这是您可以在保持 ACID 保证的同时插入的速率。这实质上意味着,如果您有一个每秒 100 个帖子的论坛……您无法通过这样的设置来处理它。

读取请求不是问题。您每秒可以有数千个读取请求,但写入请求通常小于每秒 100 个。

因此,这个问题专门针对如何在保持 ACID 保证的同时处理每秒 1k 次插入 - 假设单个节点每秒可以处理大约 80 个事务。

我可以看到这种工作的一种方法是,如果您在应用程序逻辑中的某处缓冲插入并将它们作为更大的事务提交到数据库(同时让客户端等待事务结束),如果您只需要单个插入,这应该可以正常工作,尽管它很复杂应用逻辑相当多。

performance transaction acid

1
推荐指数
2
解决办法
7079
查看次数

编写者如何不阻止 PostgreSql 中的读取

由于读者不会阻止编写者,编写者也不会阻止读者就是 MVCC 的全部内容,那么 postgresql 如何防止正在将更改提交到块/页面的编写者阻止读者读取这些不一致的数据呢?

因此,根据我对 PostgreSQL MVCC 的理解,每个表都表示为一个堆文件,每个堆文件包含页面/块的集合,这些页面/块是 8 kb 的信息段。

所以说两个事务T1并发T2运行并T1决定对block1. 因此,首先,在内存中T1读取并对其进行修改,当最终完成时,它决定提交;block1即实际上将这些内存中的更改写回block1. 所以我知道xmax它修改的先前条目被设置为id(T1),并且创建了一个新条目并xmin设置为id(T1)。现在我发现困难的是,当实际的提交过程发生时T1,比如说T2读取(而写入T1已经开始但尚未结束)。此案如何处理?

任何答案将不胜感激

postgresql transaction acid snapshot-isolation mvcc

0
推荐指数
1
解决办法
2323
查看次数