文章目录
- 什么是事务
- 针对Mysql
- 隔离级别
- 读未提交
- 读提交
- 可重复读
- 串行化
- mysql中的数据结构
- 索引数据结构
- mysql中的锁
- 种类
- **共享锁和独占锁**
- 表锁、行锁(记录锁、间隙锁、临键锁)
- spring中的事务
- 事务特性
什么是事务
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
针对Mysql
隔离级别
查询隔离级别,隔离级别是通过锁来实现的,因此不同隔离级别会有不同的性能开销。
-- 查询隔离级别
select @@global.tx_isolation;
select @@tx_isolation;-- 更改当前会话隔离级别
set session transaction isolation level serializable
- 读未提交(READ UNCOMMITTED)
- 读提交 (READ COMMITTED)
- 可重复读 (REPEATABLE READ)
- 串行化 (SERIALIZABLE)
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(READ UNCOMMITTED) | ✔ | ✔ | ✔ |
读提交 (READ COMMITTED) | ✖ | ✔ | ✔ |
可重复读 (REPEATABLE READ) | ✖ | ✖ | ✔ |
串行化 (SERIALIZABLE) | ✖ | ✖ | ✖ |
读未提交
隔离级别最低,性能最高。
任何事务的修改都会暴露给其他事务。
读提交
为解决1.1 脏数据问题,即一个事务只能读到其他事务已经提交过的数据,同时这也是Oracle默认的数据库隔离级别。
在事务中不同时间段可能会读到不一样的数据。
可重复读
事务不会读到其他事务对已有数据的修改。即a,b两个事务,a修改了某个数据,b中无论a commit或者没有commit, b读的数据不变。但是会存在一个幻读问题。
串行化
后一个事务的执行必须等待前一个事务结束。
mysql中的数据结构
索引数据结构
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
根节点至少一个元素
非根节点元素范围:m/2 <= k <= m-1 (m:阶数 )
优点:
单一节点存储的元素更多,使得查询的IO次数更少,所以也就使得它更适合做为数据库MySQL的底层数据结构了。
所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定。
所有的叶子节点形成了一个有序链表,更加便于查找。
缺点:
维护使用的开销比较大,尤其在一些insert delete时
mysql中的锁
种类
- 基于锁的属性分类:共享锁、排他锁。
- 基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)。
- 基于锁的状态分类:意向共享锁、意向排它锁。
共享锁和独占锁
Shared Locks ,简称 S锁;
独占锁 ,也常称 排他锁 ,Exclusive Locks ,简称 X锁 如select ** for update
表锁、行锁(记录锁、间隙锁、临键锁)
-
表锁:即锁整个表
-
行锁:记录锁、间隙锁、临键锁都是属于行锁,
锁住的是表的某一行或多行记录
1、 主键或者唯一索引作为条件等值查询的时候,命中记录就是加的行锁(记录锁)
2、主键或者唯一索引作为条件等值查询没有命中记录,或者在范围查询没有命中记录的时候,加的 间隙锁 (rr隔离级别)
3、主键或者唯一索引作为条件范围值查询的时候,命中记录就是加的临健锁
spring中的事务
事务特性
- 原子性(Atomicity): 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
- 一致性(Consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
- 隔离性(Isolation): 数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read Uncommitted)、提交读(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
- 持久性(Durability): 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
【星猿杂谈】:在这里我们共同探索科技新趋势,分享积累的点滴,从编程语言到系统架构,从人工智能到高性能计算,我们追求技术的进步,同时珍视分享的力量。欢迎关注我们,在技术的精彩世界中一起遨游,发现更多未知!