MySQL并发控制和锁类型

    数据库出现的并发读取错误:

    脏读 :当一个事务对数据进行了修改时,但是修改还没有提交,这时,另外一个事务同时获取了已经被修改但未提交的数据;

    幻读 : 幻读是指当事务不是独立执行时发生的一种现象,例如,事务A读取与搜索条件相匹配的若干行。事务B以插入删除行等方式来修改事务A的结果集,然后再提交,那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样;

    不可重复读 :一个事务内,多次读同一数据,在这个事务还没有结束时且在第一个事务中的两次读数据之间,另外一个事务也修改了同一数据,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读;

    数据库并发控制:

    解决并发问题最有效的方案是引入了锁的机制,锁在功能上分为共享锁(shared lock)和排它锁(exclusive lock)即通常说的读写锁和互斥锁;

    锁同样有粒度大小,有表级锁(table lock)和行级锁(row lock),分别在数据操作的过程中完成行的锁定和表的锁定。这些根据不同的存储引擎所具有的特性也是不一样的,MySQL大多数事务型的存储引擎都不是简单的行级锁,基于性能的考虑,他们一般都同时实现了多版本并发控制(MVCC);

    innodb 引擎多版本并发控制实现

    1) SELECT
    对于select语句,只有同时满足了下面两个条件的行,才能被返回:

    •行的被修改版本号小于或者等于该事务号

    •行的被删除版本号要么没有被定义,要么大于事务的版本号:行的删除版本号如果没有被定义,说明该行没有被删除过;如果删除版本号大于当前事务的事务号,说明该行是被该事务后面启动的事务删除的,由于是repeatable read隔离等级,后开始的事务对数据的影响不应该被先开始的事务看见,所以该行应该被返回;

    2) INSERT

    对新插入的行,行的更新版本被修改为该事务的事务号;

    3) DELETE

    对于删除,innodb直接把该行的被删除版本号设置为当前的事务号,相当于标记为删除,而不是实际删除;

    4) UPDATE

    在更新行的时候,innodb会把原来的行复制一份到回滚段中,并把当前的事务号作为该行的更新版本;

    MySql事务

    事务就是一组原子性的SQL语句(要么不执行要么就全部执行(done or roll back));

    特性:

    1. 原子性(atomicity):事务中的所有操作要么全部提交成功,要么全部失败回滚;

    2. 一致性(consistency):数据库总是从一个一致性状态转换到另一个一致性状态;

    3. 隔离性(isolation):一个事务所做的修改在提交之前对其它事务是不可见的;

        READ UNCOMMITTED(读未提交):事务中的修改即使未提交也是对其它事务可见;

        READ COMMITTED(读提交):事务提交后所做的修改才会被另一个事务看见,可能产生一个事务中两次查询的结果不同;

        REPEATABLE READ(可重读):只有当前事务提交才能看见另一个事务的修改结果。解决了一个事务中两次查询的结果不同的问题;

         SERIALIZABLE(串行化):只有一个事务提交之后才会执行另一个事务;

    4. 持久性(durability):一旦事务提交,其所做的修改便会永久保存在数据库中;

    详细的实现原理可以参考《高性能MySQL》第三版;

    数据库五个范式

    1)1NF(第一范式): 数据库表的每一列都是不可分割的基本数据项。 如“电话号码”这个属性可以继续被分割为“办公电话”、“手机号码”等属性,在第一范式的语义下不应该被作为单独的一列出现(每一列都是不可分割的原子项);
    2)2NF(第二范式): 必须先满足第一范式。 数据库表中的每一行必须可以被唯一的区分,即每一行中有一个或以上唯一标识将这行与其他行区分出来,唯一标识就是候选码。在2NF的语义下,所有非主属性的字段都要依赖候选码;
    3)3NF(第三范式):必须先满足第二范式。非主键字段都与主键字段有直接依赖关系,不存在传递依赖。可以理解为非主键字段只依赖主键字段,而不依赖其它的非主键字段;(在2NF基础上消除传递依赖)
    4)巴斯-科德范式(BCNF):在3NF基础上,主属性不依赖于主属性(在3NF基础上消除对主码子集的依赖)
    5)4NF(第四范式):必须先满足第三范式。简将表中的多值属性拆分出来,分别建表(同一表内的多对多关系删除);
    6)5NF(第五范式):消除连接依赖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值