原子性和一致性有什么区别?在我看来,两个人用不同的词说同样的话.
原子性
执行事务的所有任务或不执行任何任务.没有部分交易.例如,如果事务开始更新100行,但系统在20次更新后失败,则数据库将更改回滚到这20行.
一致性
事务将数据库从一个一致状态转换为另一个一致状态.例如,在借记储蓄账户并贷记支票账户的银行交易中,故障不得导致数据库仅贷记一个账户,这将导致数据不一致.
原子块可以嵌套
这听起来像一个很棒的功能,但在我的用例中我想要相反:我希望只要装饰的块@atomic()成功保留,事务就会持久.
有没有办法确保django的交易处理的持久性?
交易是ACID."D"代表耐久性.这就是为什么我认为交易不能在不丢失特征"D"的情况下嵌套.
示例:如果内部事务成功,但外部事务不成功,则外部事务和内部事务将回滚.结果:内部事务不耐用.
我使用PostgreSQL,但AFAIK这应该不重要.
我以一种模糊的方式理解常规ACID事务的工作原理.您在数据库上执行一些工作,以便在设置某种提交标志之前不确认工作.提交部分基于一些基本假设(如单个磁盘块写入是原子的).如果发生灾难性错误,您可以在恢复阶段清除未提交的数据.
分布式事务如何工作?在一些MS文档中,我已经读过你可以以某种方式在数据库和文件系统之间执行事务(以及其他事情).
这种技术可能(并且可能)用于安装程序,您希望程序完全安装或完全不存在.您只需在安装程序开始时开始一个事务.接下来,您可以连接到注册表和文件系统,进行定义安装的更改.作业完成后,如果由于某种原因安装失败,只需提交或回滚.这个神奇的分布式事务协调器会自动为您清理注册表和文件系统.
如何以这种方式处理两个不同的系统?在我看来,总是可以让系统处于不一致状态,文件系统已经提交了更改而注册表没有.我认为在MSDTC中甚至可以通过网络执行事务.
我已经阅读了http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx,但感觉只是解释的开头,而且第4步应该大大扩展.
编辑:从我在http://en.wikipedia.org/wiki/Distributed_transaction上收集的内容中,可以通过两阶段提交(http://en.wikipedia.org/wiki/Two-phase_commit)来完成.看完之后,我仍然没有理解100%的方法,似乎步骤之间有很多错误的余地.
如果我使用普通IO API读取和写入单个文件,则保证写入是基于每个块的原子.也就是说,如果我的write只修改了一个块,那么操作系统会保证写入整个块,或者根本不写入.
如何在内存映射文件上实现相同的效果?
内存映射文件只是字节数组,所以如果我修改字节数组,操作系统无法知道何时我认为写"完成",所以它可能(即使不太可能)在内存中交换内存我的块写操作的中间,实际上我写了半个块.
我需要某种形式的"进入/离开临界区",或"钉住"文件的页面到内存中,而我写它的一些方法.这样的事情存在吗?如果是这样,那可移植到常见的POSIX系统和Windows吗?
这更像是"内部运作"未定问题:
noSQL数据库如何不支持*A*CID(意味着它们无法在单个事务中更新/插入然后回滚多个对象的数据) - 更新二级索引?
我的理解是 - 为了使二级索引保持同步(否则它将变得陈旧) - 这必须在同一事务中发生.
此外,如果索引可能驻留在与数据不同的主机上 - 那么需要存在分布式锁和/或两阶段提交以使这种更新原子地工作.
但是,如果这些数据库不支持多对象事务(这意味着它们不对多个主机上的数据进行两阶段提交),它们使用什么方法来保证驻留在B树结构中的二级索引与数据不陈旧?
我想测试一下NoSQL世界.这只是好奇心,而不是绝对需要(尚未).我已经阅读了一些有关SQL和NoSQL数据库之间差异的信息.我确信潜在的优势,但我有点担心NoSQL不适用的情况.如果我理解NoSQL数据库本质上错过了ACID属性.
有人可以给出ACID关系数据库可以处理的一些真实世界操作(例如电子商务站点,或科学应用程序,或......)的示例,但NoSQL数据库可能会失败,无论是系统地某种类型竞争条件还是停电等?
如果没有修改数据库引擎,那么完美的例子就是没有任何解决方法.NoSQL数据库表现不佳的例子最终会成为另一个问题,但在这里我想看看理论上我们什么时候不能使用这种技术.
也许找到这样的例子是数据库特定的.如果是这种情况,那么让MongoDB代表NoSQL世界.
编辑:澄清这个问题我不想讨论哪种数据库对某些情况更好.我想知道在某些情况下这项技术是否绝对是一个绝对的死胡同,因为无论我们如何努力尝试某种类型的功能,SQL数据库提供的功能都无法在nosql商店之上实现.由于有许多nosql商店可用,我可以接受选择现有的nosql商店作为支持,但我最感兴趣的是商店应该提供的最小功能子集,以便能够实现更高级别的功能(比如可以使用不提供X的商店...).
我正在开发一个应用程序,我在应用程序层使用MongoDB作为数据库和Nodejs + Express,我有两个集合,即
在这里,我必须更新成千上万用户的钱包,如果成功创建一个新文档,每个交易的相关信息,这是我的代码:
userModel.update({_id : ObjectId(userId)}, {$inc : {wallet : 500}}, function (err, creditInfo) {
if(err){
console.log(err);
}
if(creditInfo.nModified > 0) {
newTransModel = new transModel({
usersId: ObjectId(userId),
amount: winAmt,
type: 'credit',
});
newTransModel.save(function (err, doc) {
if(err){
Cb(err);
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案并不atomic总是有可能用金额更新用户钱包,但是在交易收集中没有创建相关交易导致经济损失.
我听说最近MongoDB已经添加Transactions了对它的支持4.0 version,我已经阅读了MongoDB文档但是无法用Node.js中的mongoose成功实现它,有人能告诉我如何使用TransactionsMongoDB 的最新功能重新实现上面的代码哪些有这些功能
Session.startTransaction()
Session.abortTransaction()
Session.commitTransaction()
Run Code Online (Sandbox Code Playgroud)
MongoDB文档:点击这里
我正在开始研究一个需要在其数据库上提供ACID语义的项目.
由于数据的性质,它不适合存储在常见的现成系统(关系或键值)中.
关于如何实现必须提供ACID语义的系统有哪些好的资源?
我的典型Google搜索会返回有关已提供ACID语义的系统的更多信息,而不是如何实现此类系统.
我必须发送电子邮件,写入文件,并呼叫Web服务.为了保持一致性,必须执行所有步骤.如果任何步骤抛出异常或错误,则必须回滚所有步骤.
在我开始编写自己的对象ACID引擎之前,是否有任何常用的模式在对象级别实现ACID语义?
更好的是,我可以使用任何现有的.NET平台库吗?
编辑:我知道发送电子邮件无法撤消,但无法连接到SMTP服务器导致终止整个事务.此外,我希望这可以扩展用于将来的操作.
对于这个无知的问题很抱歉,但是什么样的应用程序不需要符合ACID标准的数据库服务器?我有一个SQL Server背景,其中ACID一直"在那里",现在研究其他DBMS让我思考.我能想到的大多数应用都需要原子性或隔离性.谢谢!