0
点赞
收藏
分享

微信扫一扫

【JUC进阶】14. TransmittableThreadLocal

青鸾惊鸿 2024-01-14 阅读 15

文章目录

行级锁

InnoDB 实现标准的行级锁定,其中有两种类型的锁:共享(S)锁和排他(X)锁。

共享 (S) 锁

允许持有该锁的事务读取行。

排他 (X) 锁

允许持有该锁的事务更新或删除行。

间隙锁

是对索引记录之间间隙的锁定,或者对第一个索引记录之前或最后一个索引记录之后的间隙的锁定。在可重复读的事务级别中解决幻读的问题。

表级锁

意向锁

意向锁设置在表上,简化其他事务是否可以上锁,当某个操作需要拿某种锁的时候,先判断与表锁是否冲突,减少更细力度行上是否有冲突的锁。上锁之前先上意向锁,意向锁表明稍后要进行哪种类型的行锁

  1. 共享意向锁(IS): 表示事务打算在表中的各个行上设置共享锁。
  2. 排他意向锁(IX): 表示事务打算对表中的各个行上设置排它锁。

意向锁不会阻止除全表请求之外的任何内容(例如,LOCK TABLES … WRITE)。意向锁的主要目的是表明有人正在锁定一行,或者将要锁定表中的一行
3. insert意向锁:insert操作设置间隙锁 (不重要)

自增锁

Lock Table/DDL

show engine innodb status;#判断当前数据库上边有哪些锁

在这里插入图片描述

事务

什么是事务? 事务就是将一组SQL语句作为一个工作单元以原子的进行处理,要么都成功,要么都失败。

ACID 原则

1. 原子性 A

一个事务必须被视为一个不可分割的工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

要么全部完成,要么全部不完成

2. 一致性 C

数据库总是从一个一致性状态转换到下一个一致性状态。在前面的例子中,一致性确保了,即使在执行第3、4条语句之间时系统崩溃,支票账户中也不会损失200美元。两个账户的总额总是合理的,如果事务最终没有提交,该事务所做的任何修改都不会被保存到数据库中。在处理一致性时,通常使用锁来保证。

事务前后数据完整性要一致

3. 隔离性 I

通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的,这就是隔离性带来的结果。在前面的例子中,当执行完第3条语句、第4条语句还未开始时,此时有另外一个账户汇总程序开始运行,其看到的支票账户的余额并没有被减去200美元。因此隔离性会带来相应的问题。

并发执行时,数据库为每个用户开启一个事务,各事物之间互相不可见,事物之间相互隔离

4. 持久性 D

一旦提交,事务所做的修改就会被永久保存到数据库中。此时即使系统崩溃,数据也不会丢失。持久性是一个有点模糊的概念,实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必。而且不可能有100%的持久性保障(如果数据库本身就能做到真正的持久性,备份的策略就不会被提出)

事务一旦提交就不可逆

隔离级别

1. READ UNCOMMITTED(未提交读)

在READ UNCOMMITTED级别,在事务中可以查看(获取)其他事务中还没有提交的修改。

读未提交会有什么后果呢?

专业术语来说,读未提交会产生脏读、不可重复读、幻读(不可重复读和幻读后续会讲解)。

2. READ COMMITTED(提交读)

大多数数据库系统的默认隔离级别是READ COMMITTED(但MySQL不是)。READ COMMITTED满足前面提到的隔离性的简单定义:一个事务可以看到其他事务在它开始之后提交的修改,但在该事务提交之前,其所做的任何修改对其他事务都是不可见的。

会导致什么后果呢?

专业术语上来说,读已提交会导致不可重复读和幻读。

3. REPEATABLE READ(可重复读)

REPEATABLE READ结合MVCC原理(下面会将讲解)解决了READ COMMITTED级别的不可重复读问题,保证了在同一个事务中多次读取相同行数据的结果是一样的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读的问题。

为什么解决了不可重复读的问题?
基于MVCC原理,在事务开启之前,innodb会记录一个当前事务的ID,通过当前只能读取比自己事务id小于或等于的数据值的原则,相当于建立了一个视图,这样每次读取的数据都是不变的,从而解决了不可重复的的问题。

REPEATABLE READ是MySQL默认的事务隔离级别,

4. SERIALIZABLE(可串行化)

SERIALIZABLE是最高的隔离级别。该级别通过强制事务按序执行,使不同事务之间不可能产生冲突,从而解决了前面说的幻读问题。简单来说,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中很少用到这个隔离级别,除非需要严格确保数据安全且可以接受并发性能下降的结果。

MVCC原理

MVCC的工作原理是使用数据在一个事务中看到的数据是一致的,他通过快照来实现的。这意味着,无论事务运行多长时间,只要这个事务没结束,都可以看到数据的一致视图,也意味着不同的事务可以在同一时间看到同一张表中的不同数据。

为了实现这个机制,innodb在表中添加了一些隐藏列,其中一列记录最新改动此条数据的事务的id,当出现一个早期事务读取此条记录时,发现自己的事务id比这条数据的事务ID要小,那么这个事务就知道这个值被改动过,从而去通过undolog日志去读取此条数据小于等于自己事务ID的数据值。通过这样一个机制相当于维护了一张专属于这个事务的视图,从始至终都不会发生不可重复读的情况。

小结

在事务并发控制的内容中,但是依赖事务、ACID原则、隔离原则等这些概念单独使用不能保证并发事务的执行正确的结果,需要各种概念原则相互贯通核融合。

举报

相关推荐

14. 模块

14. ATM系统

14.文件操作

14.进程时间

0 条评论