概念
事务ACID
事务:锁和并发;
原子性
要么全部成功,要么全部失败;原子性只有两种状态。一般通过undo log保存每个操作之前的状态
一致性
保证可见性。一般通过锁保证并发的每个线程都可以看到其他线程的更改。
避免线程应该看不到其他线程的更改,覆盖其他线程更改。
隔离级别
- 序列化读写(Reentrantlock,synchnoize)
通过给读和写都加同一把锁,保证读写操作每次只有一个操作发生。
- 可重复读(ReentrantReadWriteLock)
通过给读加读锁,写加写锁。达到读读可以并行
原因:即使其他线程没有感知到有其他线程在读(读不会修改数据),不会影响其他读的结果。
- 读已提交(ReentrantReadWriteLock)
在重复读情况下,支持将读锁升级为写锁。达到 读读并行,读写并行。
问题:同事务的两次读可能不一致。(幻读:同一个事务两次读取到不同数据)
- 读未提交
只给写加锁,读不加锁。读读并行,读写并行,写读并行。写写串行。
问题:读到写过程中值。(脏读:一个事务读取到另一个事务没有提交的数据)
- 快照隔离级别(SNAPSHOT ISOLATION)
也叫多版本并发控制(MVCC)
1
2
3原理:copy on write
在写的时候:将原来的数据复制一份,然后生成一个新版本的数据。达到读未提交的并行度的同时,也解 决了会读到过程数据问题。现在只能读到写修改前版本的数据或者写完成后版本的数据。
问题:log中维护数据很多的版本,导致数据log变得更大。问题: 那么写和写能不能并行?
1
持久性
事务完成以后(提交:commit):该事务对数据库所做的更改持久的保存到数据库中。
1
21. 磁盘损坏导致数据丢失:通过RAID
2.内存中数据易丢失:1. commit后写到磁盘(磁盘io比较慢)2.内存的数据打包到磁盘(代价是延迟)
事务典型异常的应对策略
业务属性不匹配
回滚(rollback)
系统DOWN机
事务原子操作的标记commit;
重启后进入recovery,这个时候系统是不能被访问的:对commit的事务继续提交,没有commit的事务回滚
事务的调优原则
减少锁的范围(表锁->行锁)
增加锁上并行的线程数(可重复读)
选择合适的锁
悲观锁
使线程进入blocking状态,然后清除cpu中存储线程的信息;加载其他线程的信息。
适合并发冲突较多的情况
乐观锁
通自旋来保证数据的准确性。
适用数据冲突较少的情况
选择正确的隔离级别
性能由低到高:序列化,读未提交,读已提交,MVCC。
代价和性能做出选择
数据库锁
2PL(两阶段锁)
U锁
1
2
3update set a= a+1 where id=100
通过有两个线程对id 100的数据进行修改,就会死锁。
数据库将第一次读锁升级为写锁。常见解决死锁的方案
1
21. 设置锁等待超时
2. 碰撞检测法
分布式事务
分布式比原来的多了什么呢?网络
- 优点:去中心化;无限扩展;避免单点故障
- 缺点:网络的延迟;数据要保存多份;网络的不可靠。
1 | 常见的方案:消息 |
未完。。。。。。。。