数据库3范式和事务控制语言

1数据库3范式

1NF:保证每个列原子不可拆分

      表的列名 :  idnameage       错      还可以拆分

                      id    name  age    对       不能拆分

目的:确保数据的原子性,避免字段内部存在复杂的数据结构

2NF:在1NF基础上,表中的所有字段都依赖唯一主键(让一个表只有一个唯一业务主键)

        要求表中的所有的非主键列必须完全依赖于主键    

目的:消除部分依赖,确保非主键列与主键之间的依赖关系是完整的,从而避免数据冗余和更新异常。

 3NF:在2NF的基础上,表中的所有字段直接依赖主键,不能间接依赖  

第三范式要求消除非主键字段之间的传递依赖。即,非主键字段之间不应存在直接的依赖关系,它们应该仅依赖于主键。非主键不能依赖非主键

目的:进一步减少数据冗余,确保数据的逻辑结构更加清晰和合理

总结:

数据库的三范式是数据库设计中的重要规范,它们通过减少数据冗余、提高数据一致性和可维护性来优化数据库结构。遵循三范式可以设计出高效、可靠、易于维护的数据库系统。然而,在实际应用中,有时为了提高查询效率或满足特定业务需求,可能会适当降低范式标准并保留一定的数据冗余。因此,在数据库设计时需要根据具体情况进行权衡和选择

2事务隔离级别

解决事务并发产生的问题

是数据库事务处理过程中,一个事务所能看到其他事务中修改的数据的程度。根据SQL标准,定义了四种隔离级别,从低到高分别为:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)

1基本操作

    查看默认事务隔离级别   

5.6版  select @@tx_isolation; 默认事务级别为:可重复读 REPEATABLE-READ

     8.0版和之后   select  @@transaction_isolation;

  修改事务隔离级别  

 -- 读未提交   
-- 设置  会话    事务          隔离       级别    读   未提交     
   set  session transaction   isolation  level   read  uncommitted; 
--  读已提交
-- 设置  会话    事务          隔离       级别    读   已提交
   set  session transaction   isolation  level   read  committed;

--  可重复读
-- 设置  会话    事务          隔离       级别    可重复        读
   set  session transaction   isolation  level    repeatable   read;
--  串行化(序列化)    串行  并行
-- 设置  会话    事务          隔离       级别    串行化
   set  session transaction   isolation  level    serializable;

   2.分类

读未提交Read Un-Committed

读已提交Read   Committed

可重复读Repeatable-Read

串行化(序列化)Serializable

            

脏读(Dirty Read)

比如:第一个窗口修改了数据但未提交,但第二个窗口能查询到

set session transaction isolation level read UNCOMMITTED; 设置会话事务隔离级别读未提交;

脏读发生在一个事务读取了另一个事务未提交的数据时。由于这些数据尚未被提交,它们可能会因为回滚操作而被撤销,因此第一个事务读取到的数据可能是“脏”的或无效的。脏读破坏了数据的“一致性”原则,因为它允许事务读取到尚未最终确定的数据

不可重复读(Unrepeatable Read)

比如:第一个窗口修改了数据并提交,第二个窗口才能查询到

set session transaction isolation level read COMMITTED; 设置会话事务隔离级别读已提交;

不可重复读是指在一个事务内,多次读取同一数据集合时,由于其他事务的并发更新,导致在不同的时间点读取到的数据不一致。这通常发生在读已提交(Read Committed)隔离级别下。尽管避免了脏读(因为只读取已提交的数据),但不可重复读仍然允许其他事务在两次读取之间对数据进行修改,从而破坏了事务内数据的一致性视图。

幻读(Phantom Read)

比如:第一个事务删除了一条数据并提交  ,第二个事务,在第一个事务删之前查了一遍数据,显示的是原来的所有数据,删除后再查,显示的数据就会比原来少一条。操作第二个事物的人可能会觉得自己出现了幻觉 故以此类叫做幻读

set session transaction isolation level REPEATABLE READ; 设置会话事务隔离级别可重复读;

幻读是更高级的并发问题,它发生在同一个事务内,两次执行相同的查询操作,但第二次查询结果中出现了第一次查询中没有的额外行(即“幻影”行)。这通常发生在可重复读(Repeatable Read)隔离级别下(尽管在某些数据库系统中,如MySQL的InnoDB存储引擎,可重复读级别通过多版本并发控制(MVCC)和索引锁来避免幻读)。幻读是因为其他事务在两次查询之间插入了新的行,而这些新行可能符合第一次查询的条件,但在第一次查询时并不存在。

2关键字

开启事务 begin ,start  transaction;

提交事务  commit

回滚事务  rollback

保存事务回滚点   save point

回滚到回滚点  rollback to       

select @@tx_isolation;
select *from  tb_dept;
-- 开启事务
begin;
 
-- 操作业务
insert into  tb_dept values(null,'行政1部','郑州1');
insert into  tb_dept values(null,'行政2部','郑州2');
update  tb_dept set dept_name='开发1部' where dept_no=101;
-- 保存事务回滚点
SAVEPOINT p1; 
insert into  tb_dept values(null,'行政3部','郑州3');
insert into  tb_dept values(null,'行政4部','郑州4');
update  tb_dept set dept_name='财务1部' where dept_no=103;
-- 回滚事务到回滚点
ROLLBACK TO  p1;
insert into  tb_dept values(null,'行政5部','郑州5');
insert into  tb_dept values(null,'行政6部','郑州6');
update  tb_dept set dept_name='市场1部' where dept_no=104;
-- 提交事务
commit;
select *from  tb_dept;

SAVEPOINT p1; 到ROLLBACK TO  p1; 之间的操作无效

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值