数据库系统原理

一、事务

概念

事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

ACID

1.原子性
:事务被视为最小的单元,要么全部提交成功,要么失败全部回滚
2.一致性
所有事务对于同一数据保持一致性操作
3.隔离性
事务在修改到最终提交以前,对其他事物不可见
4.持久性
一旦提交做出的修改就会进入数据库,系统发生崩溃,事务执行的结果也不会丢失

并发一致性的问题

1.丢失修改

T1和T2同时修改,T1先修改T2后修改,T2的修改覆盖了T1的修改

2.脏读

T1修改了,T2去读了,,T1撤回,T2读的不对

3. 不可重复读

T2读取了一个数据,T1对齐做出修改,T2再读,和第一次读取的结果不一样。

4.幻读

T1读取某个范围的数据,此时T2插入了一个数据,读取的数据结果和上次不一样

封锁

封锁粒度MYSQL中提种封锁粒度:行级锁和表锁
锁的时候应该尽量只锁需要修改的那一部分,而不是所有的。所得资源越少,发生锁争用的可能性会越小,并发程度越高

1.读写锁

互斥锁,也叫x锁,也是写锁
共享锁,简称S锁,读锁
规定:
一个事务对数据对象加了X锁,其他事务不能对其读取和写
一个事务对数据对象加了S锁,其他事务不能对其更新,但是不能加X锁

意向锁

使用意向锁(Intention Locks)可以更容易地支持多粒度封锁。
在存在行级锁和表级锁的情况下,事务 T 想要对表 A 加 X 锁,就需要先检测是否有其它事务对表 A 或者表 A 中的任意一行加了锁,那么就需要对表 A 的每一行都检测一次,这是非常耗时的。
意向锁在原来的 X/S 锁之上引入了 IX/IS,IX/IS 都是表锁,用来表示一个事务想要在表中的某个数据行上加 X 锁或 S 锁。有以下两个规定:
一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁;
一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁。
通过引入意向锁,事务 T 想要对表 A 加 X 锁,只需要先检测是否有其它事务对表 A 加了 X/IX/S/IS 锁,如果加了就表示有其它事务正在使用这个表或者表中某一行的锁,因此事务 T 加 X 锁失败。

三级封锁协议

一级封锁
T1封锁,必须加X锁,T2无法读取
二级封锁
在一级的基础上,要求要求+S锁,
三级封锁

四个隔离级别

未提交读
事务的修改,,即使没有提交 ,对其他事务也是可见的
提交读
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
可重复读
保证同一事务多次读取是一样的
可串行化
强制事务串行执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值