《数据密集型应用》事务
ACID
原子性
单个事务可终止并回滚,抛弃修改,数据库状态恢复
一致性
后置检查满足数据库约束,程序逻辑级别
隔离性
只能看到提交事务的数据修改。
持久性
事务执行结果被持久化,不会发生丢失。
事务隔离级别
读(事务开始前)已提交:
脏读:读其他事务未提交前的数据改动。
脏写:写其他事务未提交的数据改动。
问题:(读)引入事务间依赖,(写)破坏事务一致性
解决:
脏写:写阻塞,事务提交后释放写锁
脏读:1.事务提交后释放写锁,读写阻塞
2.读旧值
不可重复读(读偏差)
事务读取的时间跨度包含了另一个事务,db(t),t不一致导致数据不一致,故最先读取的数据失效
解决方法:
快照隔离:读事务开始时的数据快照(过程中其他事务提交不可见),写锁防止脏写,读写不阻塞
实现:多版本并发控制,事务读单一时间点的版本数据
读已提交可看作单个查询的快照,快照隔离对整个事务使用相同快照
快照可见性规则:
事务开始时获取快照
忽略未结束的事务(隔离性),忽略中止的事务(原子性)
忽略之后提交的事务(最终可能丢失更新)
防止丢失更新
对象级别并发控制:
1.原子更新(读-修改-写入操作)单对象
2.显式锁
自动检测丢失更新(快照隔离支持),终止并重启事务
CAS
//引申:多副本时并发写入,确认最新问题
写偏差:只有可序列化能解决
前置条件(多对象)在事务提交前不再满足
原因:幻读导致前置条件(谓词)不满足
部分解决:db约束
可序列化
方案
串行:限制:小,单分区
两阶段锁:读写阻塞,持有锁至事务结束,读锁升级为写锁
缺点:存在数据依赖即同步
谓词锁:影响谓词则同步
索引锁:用范围近似谓词条件,在索引上锁定,防止插入更新删除
可序列化快照隔离(乐观)
检测事务间提交写入:影响旧mvcc,即影响之前读取
浙公网安备 33010602011771号