mysql 锁和范式

来源:互联网 发布:淘宝情侣装秋冬装 编辑:程序博客网 时间:2024/06/11 16:11

      1  乐观锁和悲观锁

         悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

         乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

         两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

       共享锁与排它锁

      共享锁【S锁】
     
又称读锁,若事务T对数据对象A加上S锁, 则事务T可以读A但不能修改A 其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

      排他锁【X锁】
     
又称写锁。若事务T对数据对象A加上X锁, 事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

作者:cooleditphoto
链接:https://www.nowcoder.com/discuss/18563?type=2&order=3&pos=53&page=1
来源:牛客网

1NF:字段不可分;  
2NF:有主键,非主键字段依赖主键; 
3NF:非主键字段不能相互依赖; 

解释:  
1NF:原子性 字段不可再分,否则就不是关系数据库; 
2NF:唯一性 一个表只说明一个事物; 
3NF:每列都与主键有直接关系,不存在传递依赖; 

不符合第一范式的例子(关系数据库中create不出这样的表): 

表:字段1, 字段2(字段2.1, 字段2.2), 字段3 ...... 
存在的问题: 因为设计不出这样的表, 所以没有问题; 

不符合第二范式的例子: 
表:学号, 姓名, 年龄, 课程名称, 成绩, 学分; 
这个表明显说明了两个事务:学生信息, 课程信息; 

存在问题:  

数据冗余,每条记录都含有相同信息; 
删除异常:删除所有学生成绩,就把课程信息全删除了; 
插入异常:学生未选课,无法记录进数据库; 
更新异常:调整课程学分,所有行都调整。 

修正: 

学生:Student(学号, 姓名, 年龄); 
课程:Course(课程名称, 学分); 
选课关系:SelectCourse(学号, 课程名称, 成绩)。 
满足第2范式只消除了插入异常。 


不符合第三范式的例子: 

学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号"; 

存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话) 

存在问题: 
数据冗余:有重复值; 
更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 
删除异常 

修正: 
学生:(学号, 姓名, 年龄, 所在学院); 
学院:(学院, 地点, 电话)。


原创粉丝点击