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不是. 一个事务开始的时候,只能看见自己已经提交的修改.
            在不提交前,对其他事务完全不可见.
        • REPEATABLE READ
          • REPEATABLE READ 解决了脏读的问题,该级别保证同一个事务多次读取结果是一致的. 但同事导致幻读的问题.当读取某个范围的数据的时候,里一个事务又在该范围内插入新的数据
            当之前事务在读取的时候会产生幻行.
        • SERIALIZABLE
          • 最高Isolation Level级别,通过强制事务串的执行.避免了之前说的幻读,SERIALIZABLE 会在每一行数据加锁.所以可能导致大量超时和锁争抢的问题.
            非常少用.只有当需要保持数据一致性而接受没有并发的情况下才考虑.
  • 持久性(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
原文地址:https://www.cnblogs.com/maxaimee/p/6534272.html