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; 之间的操作无效