事务的认识需要一个相当漫长的流程,慢慢在实践中理解,然后在强化相关理论基础。
数据库中的事务:
传统的本地事务处理都是依靠数据库自身事务处理能力,而事务本身是传统关系型数据库的基石。简单来说事务就是一些满足acid特性的sql,数据库通过锁和日志实现这些机制。国内的mysql中innodb事务引擎引料众多,也有很多文章让我们深刻理解索引和事务的概念。此处简单说一下我的理解;
A:代表原子性,最好理解,要么全做,要么全不做。
C:一致性,简单来说就是你扣了50,有人就加了50(一致性本身存在好多种类,传统理解数据库是强一致性)
I:隔离性,事务之间的可见行,说起来很抽象,其实看看4中隔离性级别,做个实验,就很好理解了。比如市面上大多数数据库默认隔离性级别是读已提交数据,所以只有其他事务提交之后的更新你才能感知到。
但是这里面有个好玩,也是核心交易创建支付单用来判重用的,如果一个事务A插入一条数据,另外一个事务B插入同一条数据(主键相同),即使另外一个事务没提交,也会抱主键冲突。这个很好玩。可以实验尝试。
D:持久性,一旦提交,不会丢失。但是谁能保证一定不会丢失呢,天灾人祸。其实这一点,就是把事务日志提交持久化redo日志中,即使断电,内存中数据没有持久化到磁盘,利用redo日志恢复,咋恢复的,以前学习用的ARIES Recovery Algorithm。
jdbc中的事务
对于java 程序员而言,是不需要直接使用那些sql操作数据库的,我们使用jdbc, 每个数据库厂商都会为一些编程语言提供驱动,听起来高端,其实就是一个跟数据库通信的api ,内部通过数据库自己的协议通信。jdbc是一个标准接口,每个厂商各自实现,然后对于不同的数据库我们操作起来基本相同。架构如下图,最重要的就是这个Connection,我特地做了试验,想知道它什么东西。在msyql中show processlist 可以查看当前执行的线程,发现其实每个Connection对应一个处理线程,提交事务和回滚事务都是这个Connection处理,当然发送sql和接收结果集合都是它。所以本地事务处理还是靠数据库本身。
jdbc驱动的架构
jdbc驱动要实现的接口都在jdk中的rt.jar中的package java.sql,idea的中的工具可以直接查看包内的类直接关系,很爽。看下图,当然还有另外一个图,是sql相关的异常,一个项目如何设置一个规范的异常体系,后期花时间总结。
spring事务处理(有待研究)
spring 的事务管理最终还是需要依赖数据库自身事务管理,但是它在业务层提供了一个很重要的功能就是事务的传播性。很好玩,一般在开发过程中,我门都是是用默认的传播机制。
分布式事务理论(有待研究)
CAP:
BASE :
一致性协议: 两阶段,三阶段,paxos方法(zookeeper基于此实现,太复杂不学),raft(号称简单而容易实现的一致性算法,准备细致的看看)