事务基本原理
1、获取连接 Connection con = DriverManager.getConnection()
2、开启事务 con.setAutoCommit(true/false);
3、执行 CRUD
4、提交事务/回滚事务 con.commit() / con.rollback();
5、关闭连接 conn.close();
说明:Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自 动完成。
通过@Transactional 标识,生成代理,处理事务(开启正常提交事务,异常回滚事务) ),真正的数据库事务是
通过 binlog 或者 redo log 实现的。
事务传播属性
事务嵌套情况下起作用
PROPAGATION_REQUIRED :
支持当前事务,如果当前没有事务,就新建 一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。
PROPAGATION_REQUIRES_NEW :新建事务,如果当前存在事务,把当前事务 挂起。新建的事务将和被挂起的事务没有任 何关系,是两个独立的事务,外层事务失败 回滚之后,不能回滚内层事务执行的结果, 内层事务失败抛出异常,外层事务捕获,也 可以不处理回滚操作
ROPAGATION_SUPPORTS :支持当前事务,如果当前没有事务,就以非 事务方式执行。
PROPAGATION_NOT_SUPPORTED :以非事务方式执行操作,如果当前存在事 务,就把当前事务挂起。
###事务特性
ACID 特性。
原子性(Automicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要 么都做,要么都不做。
一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。 一致性与原子性是密切相关的。
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及 使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):持久性也称永久性(Permanence),指一个事务一旦提交,它 对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何 影响。
####JDBC事务隔离级别
Read-Uncommitted | 0 | 导致脏读 |
Read-Committed | 1 | 避免脏读,允许不可重复读和幻读 |
Repeatable-Read | 2 | 避免脏读,不可重复读,允许幻读 |
Serializable | 3 | 串行化读,事务只能一个一个执行,避免了 脏读、不可重复读、幻读。执行效率慢,使 用时慎重 |
说明:spring隔离级别相对于以上 多一个 default级别
isolation_default: 这是个 PlatfromTransactionManager 默 认的隔离级别,使用数据库默认的事务隔离 级别。另外四个与 JDBC 的隔离级别相对 应。
Spring事务API架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnSheFm0-1587293081912)(/Users/rachel/Library/Application Support/typora-user-images/image-20200415101221089.png)]
###分布式事务
数据一致性理解:
强一致性:当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更 新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。 根据 CAP 理论,这种实现需要牺牲可用性。
弱一致性:系统并不保证后续进程或者线程的访问都会返回最新的更新过的值。系统在 数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可 以读到。
最终一致性:弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回 上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟, 系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。
分布式事务一致性问题?
基于CAP理论,抛弃强一致性,为了可用性和分区容错性,忍痛放弃强一致支 持,转而追求最终一致性。
为了保障系统的可用性,互联网系统大多将强一致性需求转换成最终一致性的需求,并 通过系统执行幂等性的保证,保证数据的最终一致性。
分布式事务服务(Distributed Transaction Service,DTS)是一个分布式事务框架,用 来保障在大规模分布式环境下事务的最终一致性