事务
本地事务
对同一数据源操作,进行一组相关的sql操作(至少两个增删改),要么全部成功,要么全部失败。
事务四个特性(ACID)
原子性,一致性,隔离性,持久性
事务的隔离级别
根据两个事务之间的干扰性强弱,划分为几个级别
读未提交、读已提交、可重复读、串行化
脏读:事务a读取到了事务b未提交的数据,有可能这些数据就是事务b的中间数据
不可重复读:可重复读
幻读:一个事务在查询,另一个事务在做插入或者删除,此时就会出现幻读。
事务隔离级别越高,性能越低。
本地事务实现
spring方式:aop实现,xml注解形式(@Traansactional)
1.配置数据源
2.配置事务管理器,跟数据源匹配
3.切面和切入点(决定给哪些业务)
4.配置事务通知
5.将切入点和事务通知联系起来
分布式事务
事务的参与者服务器数据源事务管理器,分布在不同的节点上.原子性操作,要么全部成功,要么全部失败.
刚性事务:ACID
柔性事务:CAPBASE
CAP理论
定义:数据一致性(consistency)、服务可用性(availability)、分区容错性(partition-tolerance)
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡。
CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
BASE理论
BASE其实是下面三个术语的缩写:
- 基本可用(Basically Available)
- 软状态(Soft state)
- 最终一致(Eventually consistent)
核心思想:分布式事务,只需要达到最终一致性即可。
柔性事务
概念:符合BASE理论的分布式解决方案,就叫做柔性事务。
典型的柔性事务方案:
- TCC(两阶段型、补偿型)
- 可靠消息最终一致性(异步确保型)消息队列保证事务一致性
- 非事务型消息中间件(activemq,rabbitmq,kafka)
- 事务性消息rocketmq
- 最大努力通知(非可靠消息、定期校对)
DTP
分布式事务处理模型(DTP)
模型元素5个:
- 应用程序 Application Program 简称AP
- 资源管理器 Resource Manager 简称RM,例如数据库、文件系统等
- 事务管理器 Transaction Manager 简称TM,负责分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚等。
- 通信资源管理器 Communication Resource Manager 简称CRM:控制一个TM域内或者跨TM域的分布式应用之间的通信。
- 通信协议 Communication Protocol 简称CP
XA规范
XA规范最主要的作用是:定义了RM-TM的交互接口。
XA规范与二阶段协议
二阶段协议并非在XA规范中提出来的,但是XA规范定义了两阶段提交协议中需要使用到的接口。
XA和二阶段是相互参考的。
JTA、XA、atomikos之间的关系
可以认为JTA是XA规范的java版本。在jta中,事务管理抽象为javax.transaction.TransactionManager接口,并通过底层事务服务(JTS)实现。
JTA仅仅定义了接口
实现:
- J2EE容器提供的JTA实现(JBOSS)
- 独立的JTA实现:例如JOTM、Atomikos,可用于Tomcat、jetty以及普通的java应用。
- Atomikos JTA实现,用于tomcat容器