1. 单机事物理解:
具有ACID特性才能算是事物,
A: 原子性 , 即 事物的组成部分 要么全部执行,要么都不执行。 原子性通过undo 实现, 即事物执行过程中的步骤对应几个版本,版本对应响应的Undo回滚段,数据状态的每次变化都会保存在undo日志里。 执行中某一步骤出了问题要回滚 通过该步骤前一段步骤对应的undo来恢复数据状态。
C: 一致性 ,即 事物内的 数据状态在执行过程中整体必须保持一致, eg: 事物1:A转100给B,事物2: B转100给C ; 在事物1:A-100执行过程中,事物2访问A帐号扔为100执行了转账操作给C,而事物1 也能正常执行A-100转给B , 这样原本A、B、C 三账号共计100元 变为 200元, 数据不一致。
一致性(happing-before) 保证 在多个事物并发执行时,每个事物的执行过程不受其他事物干扰,让该事物看起来就象只有它一个事物执行,从而保证该单元事物涉及的数据都是按照该事物逻辑单元执行, 即 保证事物执行涉及的数据不被其他事物更改或访问。 一致性与原子性是不同的概念。
事物的一致性其实保证 单元事物在全部执行完之后才能对其他单元事物可见。这也就避免上面的转账问题。
i : 隔离性: 由 锁 实现 事物之间的隔离, 不同的锁(序列化,排它锁,读写锁分离、写锁覆盖读锁(读写事物)) 引用:所有操作序列化 -》 对共享数据加 排他锁(表级,行级)--》读写锁分离 (共享锁,排他锁)实现读读并行,即实现可重复读的隔离级别 --》 要实现读写并行,即去掉读锁(共享锁),但是就不可重复读了。
隔离是对一致性的破坏,最高级别的隔离即 事物之间串行化为一个队列执行 是对一致性最低级的破坏。
隔离级别:(从高到低)
序列化读写 (所有读,写事物都不能并发执行)
可重复读 (可读读并发)
读已提交 (可读读,读写并发,通过后面的写事物的写锁 覆盖 前面的 读事物读锁,且前面的读事物里的数据不能重复读)
读未提交 (可读读、读写、写读并发, 写读并发会出现脏读)
D: 持久性: 提交后的事物必须要持久化,持久化过程可能会出现不能保存问题。
针对持久化 与 提交延迟 的 调校 做出的 持久策略如下:
1. 事物一旦COMMIT到内存 就返回成功,标志事物处理完成。 延迟低,但内存持久化硬盘得不到保证。
2. 将多次commit到内存数据打包再写入内存。 必须达到多次提交后,才能持久化硬盘,所以有额外延迟。