数据库基础不完整总结

​ 在学习过程中,数据库可谓是重中之重,对于一些基础的概念和知识点,我整理了一下以便自己的记忆和复习,同时希望可以对大家有所帮助。
数据库事务

四个基本特征

1 原子性:事务不可分割。事务包含的所有操作要么全部成功,要么全部失败回滚,因此操作成功就必须要完全应用到数据库,如果操作失败就不能对数据库产生影响。

2 一致性:事务前后数据一致。指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

3 隔离性:多个事物之间,保持数据的隔离。当多个用户访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所打扰,多个并发事务要相互隔离。

4 持久性:保证事务在提交后,数据库必须对数据进行操作而产生永久性影响。一个事务一旦被提交了,那么对数据库中数据的改变就是永久性的,即使是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

在并发环境下,事务的隔离性得不到保证将会发生以下问题:

丢失修改;A事务对一个数据进行修改,接着B事务又对这个数据进行修改,则B事务的修改将覆盖A事务的修改,造成了数据丢失,影响了事务的一致性。(一些极端的例子不会影响事务的一致性,例如A事务对数据的修改对最终的数据变换没有什么影响)。

脏读:脏读就是读取未提交的事务。就好像一个数据起初是干净的纯粹的,事务A对其进行访问操作,事务A有读取了这个数据,,事务A发现情况不对又回滚了操作,而B什么都不知道,而最终结果是事务B获取的是一个不纯粹的数据。

不可重复读:事务A在读取数据之后,事务B对该数据进行修改,事务A为了再次验证数据的正确性,重新读取数据,得到了两个不一样的结果。

虚读(幻读):事务A读取某一范围的数据,事务B在这个范围内新插入数据,事务A再次读取,得到不一样的结果。

AUTOCOMMIT
MySQL 默认采用自动提交模式。也就是说,如果不显式使用START TRANSACTION语句来开始一个事务,那么每个查询都会被当做一个事务自动提交。

封锁粒度

MySQL里面提供了两种封锁粒度:行级锁,表级锁。

应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。

但是加锁需要消耗资源,锁的各种操作(包括获取锁、释放锁、以及检查锁状态)都会增加系统开销。因此封锁粒度越小,系统开销就越大。

在选择封锁粒度时,要根据并发程度和系统开销来平衡选择。

封锁类型

  1. 读写锁

排它锁(Exclusive),简写为 X 锁,又称写锁。

共享锁(Shared),简写为 S 锁,又称读锁。

  1. 意向锁意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。

意向共享锁,简称IS锁;

意向排它锁,简称IX锁;

共享意向排他锁,简称SIX锁,表示该事务要读整个表(所以要对该表加 S锁),同时会更新个别元组(所以要对该表加 IX锁)。

封锁协议

  1. 三级封锁协议
    一级封锁协议 :事务 T 要修改数据 A 时必须加 X 锁,直到 T 结束才释放锁,可以解决丢失修改问题,因为不能同时有两个事务对同一个数据进行修改,那么事务的修改就不会被覆盖。

二级封锁协议:在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。

三级封锁协议:在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。2. 两段锁协议
加锁和解锁分为两个阶段进行。
可串行化调度是指,通过并发控制,使得并发执行的事务结果与某个串行执行的事务结果相同。事务遵循两段锁协议是保证可串行化调度的充分条件,但不是必要条件。

MySQL 隐式与显示锁定

MySQL 的 InnoDB 存储引擎采用两段锁协议,会根据隔离级别在需要的时候自动加锁,并且所有的锁都是在同一时刻被释放,这被称为隐式锁定。InnoDB 也可以使用特定的语句进行显示锁定。

隔离级别
未提交读(READ UNCOMMITTED):事务中的修改,即使没有提交,对其它事务也是可见的。RU最低级别,任何情况都无法保证。
提交读(READ COMMITTED):一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。RC,可以避免脏读。
可重复读(REPEATABLE READ):保证在同一个事务中多次读取同样数据的结果是一样的。RR,可以避免脏读和不可重复读。
可串行化(SERIALIZABLE):强制事务串行执行。可以避免脏读,不可重复读,幻读。
以上内容可能比较杂乱,相对不是太完整,但对于正确性可以得到保证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值