标签: acid

使用Hibernate Search + Infinispan Directory的事务ACID属性

我有以下设置:

  • JPA(2.0)通过Hibernate(4.1)
  • Infinispan作为二级缓存(5.1)
  • Hibernate Search连接到Hibernate(4.1)
  • Infinispan作为Hibernate搜索目录(Lucene)
  • 连接Infinispan目录的JDBC CacheStore
  • PostgreSQL(9.1)数据库存储实体和Lucene目录.
  • Bitronix(2.1.2)作为事务管理器
  • 我不是在使用Java EE,而是使用Spring(3.1)

Infinispan作为二级缓存很好,不需要恢复,并且由于Cache的性质,您可以读取自己事务中的更改.

在阅读源代码几小时后,当我更新实体时,Hibernate Search不会更新Lucene目录,但是在事务结束时(如果它提交),所以我想搜索我刚刚更新的文本,在同一笔交易里面,我不能吗?

但是,在事务完成后,Hibernate Search会在不同的线程中对Directory进行更新.因此,如果其中一个目录更新失败,那么Lucene将与我的实体不一致?如果在将更新发送到目录并且需要恢复之前发生了某些事情,这些更新是否会丢失?

假设此"第一"事务成功提交,更新将发送到Infinispan目录.这里将开始一项新交易.通过谁?Lucene可以选择使用JMS发送更新.假设选项已激活,因此JMS消息初始化新事务.

Infinispan将使用它接收的更新修改其内存目录,但是在提交后,持久的CacheStore将在此事务完成时再次更新.因此,如果在更新jdbc CacheStore时发生某些事情,它将有可能没有更新,但Infinispan Memory Directory将应用它们.

我的问题是,考虑到我使用的所有模块都支持事务,并且他们甚至支持加入全局事务(XA),是否有办法实现真正​​的事务性?也许我只是没有看到它.

java transactions acid hibernate-search infinispan

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

线程无限期阻塞 - Haskell - 酸状态

我担心酸状态产生到许多事件文件和检查点,用户"stepcut"告诉我有一个名为createArchive的解决方案实现了删除旧事件...问题是,当我使用它时,我得到这个错误:

<fileName.exe>: thread blocked indefinitely in an MVar operation
Run Code Online (Sandbox Code Playgroud)

我认为它是由于W7的权限,但是当我在"管理员"运行它,我不能在这里看到控制台,但这些事件的文件仍然存在,所以我认为它不工作.

如果我通过ghci运行代码,我没有收到错误,但它锁定了控制台,所以我需要CtrlC继续工作.

有人得到这个错误吗?

haskell acid

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

需要一种在SQL数据库中存储/查询json的有效方法

我正在实现一个服务,每个用户必须拥有自己的json/document数据库.除了让用户通过示例查询json文档之外,数据库还必须支持涉及多个文档的ACID事务,因此我放弃使用Couch/Mongo或其他NoSQL数据库(不能使用RavenDB,因为它必须在Unix系统上运行).

考虑到这一点,我一直试图找到一种在SQL数据库之上实现它的方法.这是我到目前为止所提出的:

CREATE TABLE documents (
  id INTEGER PRIMARY KEY,
  doc TEXT
);

CREATE TABLE indexes (
  id INTEGER PRIMARY KEY,
  property TEXT,
  value TEXT,
  document_id INTEGER
)
Run Code Online (Sandbox Code Playgroud)

每个用户都有一个包含这两个表的数据库,用户必须声明他需要查询哪些字段,以便系统可以正确填充"索引"表.因此,如果用户"A"将其帐户配置为按"名称"和"年龄"启用查询,则每次用户插入具有"名称"或"年龄"属性的文档时,系统也会将记录插入"索引" table,'property'列包含name/age,'value'将包含属性值,'document_id'将指向相应的文档.

例如,假设用户插入以下文档:

'{"name" : "Foo", "age" 43}'
Run Code Online (Sandbox Code Playgroud)

这将导致对'documents'表的插入以及对'indexes'表的两次插入:

INSERT INTO documents (id,doc) VALUES (1, '{"name" : "Foo", "age" 43}');
INSERT INTO indexes (property, value, document_id) VALUES ('name', 'foo', 1);
INSERT INTO indexes (property, value, document_id) VALUES ('age', '43', 1);
Run Code Online (Sandbox Code Playgroud)

然后,假设用户'A'向服务发送了以下查询:

'{"name": "Foo", "age": 43}' //(the queries are also json documents).
Run Code Online (Sandbox Code Playgroud)

此查询将转换为以下SQL: …

sql database acid nosql document-database

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

如何使存储过程立即提交?

编辑此问题不再有效,因为问题是其他问题。请在下面的回答中查看我的解释。

我不确定礼仪,所以我将这个问题保留在当前状态

我有一个存储过程,可以将一些数据写入表中。

我正在使用Microsoft Practices Enterprise库进行存储过程调用。我使用对ExecuteNonQuery的调用来调用存储过程。

在ExecuteNonQuery返回之后,我调用了一个第三方库。它在大约100毫秒内在单独的线程上给我回电。

然后,我调用另一个存储过程来提取我刚刚编写的数据。在大约99%的情况下,将返回数据。偶尔,它不返回任何行(即找不到数据)。如果我在调试器中放置条件断点以检测此条件并手动重新运行存储过程,它将始终返回我的数据。

这使我相信,编写存储过程在调用时只是没有提交而已。

对于sql来说,我还是一个新手,所以我做错了完全有可能。我以为编写存储过程会阻塞,直到其内容提交给db。

编写存储过程

 ALTER PROCEDURE [dbo].[spWrite] 
    @guid varchar(50),
        @data varchar(50)
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

-- see if this guid has already been added to the table
DECLARE @foundGuid varchar(50);
SELECT @foundGuid = [guid] from [dbo].[Details] where [guid] = @guid; 
    IF @foundGuid IS NULL
    -- first time we've seen this guid
    INSERT INTO [dbo].[Details] ( [guid], …
Run Code Online (Sandbox Code Playgroud)

sql-server acid

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

为什么两阶段提交被认为是原子的?

两阶段提交被称为“原子提交协议”。我希望这意味着所有客户从事务提交之前或提交之后都可以看到世界的状态,而没有中间状态。似乎它可以进入一种状态,其中事务已部分提交,客户看到不一致的数据,从而破坏了原子性。

考虑两个数据库A和B的情况。如果在提交阶段A提交之后但B提交之前存在分区,则事务将部分提交。查询A和B的用户将看不到一致的数据-事务已在A上提交,但B具有来自提交之前的数据。

ACID的“一致”部分似乎也已损坏-查询A和B的客户端可能会看到违反业务规则的数据。

我的想法是,当分区结束并且事务管理器指示B提交时,系统最终将能够从中恢复。但是,与此同时,系统处于不一致的“部分提交”状态。难道不是要防止这种情况的全部原因吗?通过恢复时间一致性,损坏可能已经造成。

当两阶段提交被称为原子时,指的是什么属性?

transactions acid atomic distributed-transactions atomicity

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

原子计数器-Redis vs Postgres还是其他?

我需要在云上实现一个原子计数器,以从并发连接生成一个串行整数。背后的业务是跟踪服务器。

优先要求:

  1. (必须)持久 -确保一旦一个客户获得一个号码,就不会再有其他客户获得这个相同的号码。没有重复...
  2. (必须)可伸缩 -当前的负载为200-1000个并发客户端连接时的当前负载为10K /秒和将来的1M /秒。可扩展性增加100
  3. (必须)平均<+ -15ms(postgres / mysql / redis很棒,像DynamoDB这样的http延迟是不可能的),这只是为了过滤慢速的解决方案
  4. (很高兴)increment by by这是一种可伸缩性,其中客户端以块(例如100)为单位递增,并管理应用程序内存中的增量。
  5. (很高兴) 5k / s的票价低于150美元,并且预计价格会进一步下跌
  6. (很高兴)HA(高可用性) -我可以处理0.01%的故障,但是耐用性很重要,我不需要重复的数字。

我的选择是:

  1. postgres的顺序CREATE SEQUENCE serial CACHE 100; SELECT nextval(sequence)-140 $ / m MultiAZ AWS RDS db.m3.medium的速度不如redis快,但我认为平均<7ms。“缓存”是一项强大的功能,可以提高性能。
  2. Redis Sentinel的 Redis INCR / RDS MultiAZ-cache.m3.medium MultiAZ-120 $ / m-持久性存在疑问。

redis具有INCRBY,而postgres仅具有序列的“缓存”功能,该功能需要往返数据库。

有输入吗?关于这两个或其他选择?

相关参考:

  1. 原子计数器Postgres和MongoDB
  2. http://redis.io/topics/persistence
  3. https://www.quora.com/When-should-I-use-redis-as-my-primary-data-store
  4. https://muut.com/blog/technology/redis-as-primary-datastore-wtf.html
  5. https://discuss.elastic.co/t/replacing-redis-with-elasticsearch-get-query-speed-counters-and-lists/5609/2

mysql postgresql acid redis durability

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

了解多个gunicorn进程的工作原理

我不知道我想要理解的是什么,上网把我带到了这里,现在我的代码中需要这个。

我使用 django-rest-framework、gunicorn 和 Nginx。

假设我有 3 个gunicorn 设置的工作进程。

我有一个非常简单的视图,它从数据库读取一个值,执行一项不同的任务,大约需要 1 秒,将值增加 1,然后将其保存回数据库。

class CreateView():
    value = MyModel.objects.get(id=1).integerValueField
    otherTask() #takes around 1 second (assume)
    updatedValue = value + 1
    MyModel.objects.filter(id=1).update(integerValueField=updatedValue)
    return
Run Code Online (Sandbox Code Playgroud)

这总是有效吗?

如果gunicorn的不同工作进程正在处理并发用户的请求怎么办?如果在读取值和由其他工作进程更新值之间由不同的进程更新数据库(integerValueField 字段) ?这是为了保持完整性而以某种方式锁定的吗?

如果我可以获得有效的链接来阅读有关该主题的更多信息,那么对我来说会很有效。

python django acid django-rest-framework

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

python中任何与ACID具有相同安全性的写函数在数据库中

标题本来可以更好,但无论如何。我想知道是否有任何写入文件的功能,例如数据库的ACID属性。原因是,我要确保在电源中断的情况下,文件写入“我正在做”不会弄乱和破坏文件。

python acid

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

使用函数的acid-state-safeCopy

有数据类型时出现问题:

MyData = One Int | Two (Int -> Int) | Three | Four
Run Code Online (Sandbox Code Playgroud)

问题是,当我说

$(deriveSafeCopy 0 'base ''MyData)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

No instance for (SafeCopy (Int -> Int) )
   arising from the use of `getSafePut`
...
Run Code Online (Sandbox Code Playgroud)

所以我意识到SafeCopy可能不适用于功能......

我有麻烦吗?因为我无法改变MyData的模型....有没有办法做到这一点?

haskell acid

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

Cosmos DB 是否支持跨分区事务?

我想通过更改分区键将文档移动到另一个分区。我在某处读到,必须首先删除该文档,然后必须创建一个具有新分区键的新文档。如果是这样的话,这个事务可以是原子的吗?换句话说,是否可以跨两个分区执行事务并在一个更新/写入操作失败时回滚?

transactions acid document-database azure-cosmosdb

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