Mysql 事务学习笔记
1读写锁
1.1为什么为出现读写锁?
当一个人在update这个数据,另一个人在select查询这个数据的时候.会产生一种数据混乱,应运产生的锁.
锁的概念:
- 读锁是共享的,并且不会阻塞. 写锁则是排他的
- 同一个时间内只能有一个用户写入.
1.2 锁粒度.
- 太多的锁又会影响效率,为了保证效率,会给不同级别的失误.安排不同的锁.最好只是精确的锁定. 因为锁本身不仅影响效率,也消耗资源.通常情况下,锁越少效率越高.
锁策略,就是在锁的开销和数据的安全性做出平衡.大部分商业数据库并没有提供特别多选择,只是在表上加上行级锁.
1.3 Mysql 的锁策略
- 表锁,最基本也是开销最小策略.搜定这张表,在用户对表修改时候,需要先获得锁,并且阻塞其他用户的读写操作. 只有没有写锁的时候其他用户才能获得读锁,并且读锁之前不会阻塞
- 行级锁可以最大成都的支持并发处理
2 事务
事务是一组原子性的sql查询,如果能执行查询全部语句,那么查询全部,如果又一条语句不成功,那么所有的都不执行.事务都要经过ACID 测试不然没有意义
2.1 ACID事务的四项检测
-
原子性(atomicity)
- 一个事务被视为一个不可分割的最小工作单元.就像原子不可分割一样.
-
一致性(consistency)
- 数据库总是从一个一致性的状态转换为另一个一致性的状态.要么全部成功,要么全部失败,结果应该是一致的,不应该有的成功,有的失败.
-
隔离性(Isolation)
- 一个事务在做修改成功之前,对其他的事务是不课件的. 当你对一个账户进行取款操作,那么另一个程序是无法看见你的操作结果.直到你成功之前
- 隔离级别Isolation Level
- Read uncommited
- 在READ UNCOMMITED级别. 事务中的修改,即使没有提交,对其他事务可见.
- READ COMMITED
- 大多数数据库的默认级别都是Read committed.Mysql不是. 一个事务开始的时候,只能看见自己已经提交的修改.
在不提交前,对其他事务完全不可见.
- 大多数数据库的默认级别都是Read committed.Mysql不是. 一个事务开始的时候,只能看见自己已经提交的修改.
- REPEATABLE READ
- REPEATABLE READ 解决了脏读的问题,该级别保证同一个事务多次读取结果是一致的. 但同事导致幻读的问题.当读取某个范围的数据的时候,里一个事务又在该范围内插入新的数据
当之前事务在读取的时候会产生幻行.
- REPEATABLE READ 解决了脏读的问题,该级别保证同一个事务多次读取结果是一致的. 但同事导致幻读的问题.当读取某个范围的数据的时候,里一个事务又在该范围内插入新的数据
- SERIALIZABLE
- 最高Isolation Level级别,通过强制事务串的执行.避免了之前说的幻读,SERIALIZABLE 会在每一行数据加锁.所以可能导致大量超时和锁争抢的问题.
非常少用.只有当需要保持数据一致性而接受没有并发的情况下才考虑.
- 最高Isolation Level级别,通过强制事务串的执行.避免了之前说的幻读,SERIALIZABLE 会在每一行数据加锁.所以可能导致大量超时和锁争抢的问题.
- Read uncommited
- 隔离级别Isolation Level
- 一个事务在做修改成功之前,对其他的事务是不课件的. 当你对一个账户进行取款操作,那么另一个程序是无法看见你的操作结果.直到你成功之前
-
持久性(durability)
- 一旦事务提交,修改就会永久保存在数据库中.及时系统崩溃也不会丢失.这个策略主要保证数据不会丢失.而且上持久性也分不同的级别.有的持久程度高,又的持久程度低.
1-1 各种隔离级别的区别和特点
Isolation Level(隔离) | 脏读可能性 | 不可重读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
Read uncommitted | YES | YES | YES | NO |
READ COMMITTED | NO | YES | YES | NO |
PEPETABLE READ | NO | NO | YES | NO |
SERIALIZABLE | NO | NO | NO | YES |