发帖  主题  评论  推荐  标签 用户 查搜   用户 密码 自动 注册  
 
面向对象 设计模式 领域驱动设计 云架构 框架 开发教程 SOA 大数据 扩展性 并发编程 EDA 分布式 函数编程

数据库事务机制ACID

  事务机制是可以保证一系列写操作要么全部完成,要么全部不会完成,不会发生只完成一系列中一两个写操作,事务机制缺省一般由数据库完成,也可以通过应用程序实现(如Java的JTA等)

  事务由四个属性,简称ACID:

  1. Atomicity原子性:一个事务的所有系列操作步骤被看成是一个操作,也就是一个原子操作,打个比喻:多个SQL语句如同一个SQL执行一样。
  2. Consistency一致性:如果两个以上数据表有关联,那么更新一个表同时另外一个表也要一起更新,否则两个表的数据记录就发生不一致了。
  3. Isolation隔离性:主要用于实现并发控制, 隔离能够确保并发执行的事务能够顺序一个接一个执行,通过隔离,一个未完成事务不会影响另外一个未完成事务,隔离是通过用悲观或乐观锁机制实现的。
  4. Durability耐久性:一个成功的事务将永久性地改变系统的状态,所以在它结束之前,所有导致状态的变化都记录在一个持久的事务日志中。如果我们的系统突然受到系统崩溃或断电,那么所有未完成已提交的事务可能会重演。

  关系数据库提供默认不同级别的ACID,完全真正严格的ACID会导致性能下降,因此,事务代表的可靠性和性能扩展性是一对矛盾,如何进行平衡是架构设计的主要考量,特别是在分布式系统中如何保证ACID事务是一项极具有挑战力的工作。

2PC

  2PC(2 phase commit)是两段事务提交的简称,JavaEE的JTA/XA是2PC一种实现。2PC适合有多个数据源情况下统一按照ACID原则完成操作,比如一个操作涉及三个数据库的三个表a b c,如何保证这三个表的数据同时操作完成,保证在同一逻辑下的一致性,这是2PC关注所在,如果没有2PC,有可能a表修改成功,b表和c表没有修改成功,那么就出现不一致性。

  两段提交协议是一种分布式资源的原子确认协议,这个协议是通过两段过程完成业务数据的更改:第一段是预准备阶段,事务管理器通知所有分布式资源准备接受提交或退出事务,第二阶段,事务管理器安装每个分布式资源的回应情况决定是真正提交完成事务或者退出事务。在第一阶段,我们通过服务的JTA事务修改的数据库数据并没有真正写入数据库,只有最后阶段完成时才真正写入。

  以转账案例为说明,A账户转到B账户100元,A账户余额应该减去100元,而B帐号增加100元,如果A账户在上海机房服务器,B帐号在北京机房,那么通过2PC保证这种加减一致性,如果没有2PC,A帐号已经减去100元,但是B账户却没有增加100元,整个操作也没有报错回滚,所以,2PC是保证业务逻辑正确性,精确性的。

  注意:2PC的这种分布式数据一致性与CAP定理中分布式数据一致性是有区别的。

 

什么是数据库ACID

关系数据库是如何工作的?

SQL入门教程

JDBC基础教程

JDBC事务锁基础教程

JDBC悲观锁与乐观锁基础教程

JDBC隔离级别基础教程

ACID和CAP的详尽比较

业界最大谎言:大部分关系数据库并不真的支持ACID

Java持久锁总结

数据库系统并发控制原理

PostgreSQL、Oracle/MySQL和SQL Server的MVCC实现原理方式

最终一致性其实比MVCC简单

线性化与串行化比较

为什么大部分NoSQL不提供分布式事务?

比特币区块链是一种分布式的事件流日志

使用Spring Cloud和Reactor在微服务中实现EventSourcing

如何提高JDBC插入速度?

可扩展伸缩架构中的状态

 

参考主题:

Hibernate专题

更多事务架构

更多JTA事务

EventSourcing专题

微服务专题

数据库专题

 

解道移动版 | 关注解道 | 联系解道 | 关于解道 | 广告联系 | 网站地图 | 设为首页

沪ICP证12033263 如有意见请与我们联系 Powered by JdonFramework
返回顶部