Loading

Mysql事务相关

事务的基本要素(ACID)

  1. 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,就像化学中学过的原子,是物质构成的基本单位。
  2. 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  3. 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
  4. 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

事务的并发问题

  1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  2. 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  3. 幻读:管理员A将数据库中所有学生的成绩从具体分数改为ABC等级,但是管理员B就在这个时候插入了一条具体分数的记录,当管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

MySQL事务隔离级别

  1. RU读未提交(read-uncommitted):是脏读,是不可重复读,是幻读
  2. RC不可重复读(read-committed):不是脏读,是不可重复度,是幻读
  3. RR可重复读(repeatable-read):不是脏读,不是不可重复度,是幻读
  4. 串行化(serializable):不是脏读,不是不可重复度,不是幻读

mysql默认的事务隔离级别为可重复读(repeatable-read)(RR)
间隙锁只有在事务隔离级别 RR 中才会产生,会封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据,这是为了防止出现 幻读 现象;

MySQL共享锁与排他锁

共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到最新数据。特点:

  1. 多个事务的查询语句可以共用一把共享锁;
  2. 如果只有一个事务拿到了共享锁,则该事务可以对数据进行 UPDATE DETELE 等操作;
  3. 如果有多个事务拿到了共享锁则所有事务都不能对数据进行 UPDATE DETELE 等操作。

排他锁又称为写锁,简称X锁,顾名思义,排它锁不能与其它锁并存,而且只有一个事务能拿到某一数据行的排它锁,其余事务对于该数据的操作将会被阻塞,直至锁释放。

共享/排它锁的使用场景:

共享锁

  1. 确保某个事务查到最新的数据;
  2. 这个事务不需要对数据进行修改、删除等操作;
  3. 也不允许其它事务对数据进行修改、删除等操作;
  4. 其它事务也能确保查到最新的数据。

排它锁

  1. 确保某个事务查到最新的数据;
  2. 并且只有该事务能对数据进行修改、删除等操作。
posted @ 2022-04-09 22:28  字符串爱了数组  阅读(26)  评论(0编辑  收藏  举报