SQL数据库(事务,数据库设计(三范式))

事务

事务是一组操作的集合,他是不可分隔的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤
销操作请求。这些操作要么同时成功,要么同时失败。
mysql数据库中,事务默认是自动提交的,也就说执行完一条DML语句时,mysql会立即隐式的提交事务。

create TABLE account(
id int PRIMARY KEY AUTO_increment,
aname VARCHAR(10),
money DOUBLE(10,2)
);
insert into account (aname,money) VALUES('张三',10000),('李四',10000);

未控制事务

-- 1 查询张三余额
select * from account where aname='张三';
-- 2 张三的账户余额减少1000
UPDATE account set money = money - 1000 where aname='张三';
-- 3 李四的账户余额增加1000
UPDATE account set money = money + 1000 where aname='李四';

运行结果:
数据是一致的。
测试异常情况

-- 1 查询张三余额
select * from account where aname='张三';
-- 2 张三的账户余额减少1000
UPDATE account set money = money - 1000 where aname='张三';
出错了....
-- 3 李四的账户余额增加1000
UPDATE account set money = money + 1000 where aname='李四';

运行结果:
出错了…不符合sql语法 ,执行会报错,检查之后,发现数据才操作前后不一致。

控制事务一

1、 查看当前数据库的设置 事务的提交方式
在这里插入图片描述
查询得到的值为1 意味着是自动提交
设置事务的提交方式为手动提交。

set @@autocommit = 0 ;

2 .、提交事务

commit;

3 、回滚事务

rollback;

在这里插入图片描述

事务控制方式二

在之前先将事务的提交方式改为自动提交

set @@autocommit = 1 ;
-- 开启事务
start TRANSACTION; / begin
-- 执行dml语句
UPDATE account set money = money + 1000 where aname='李四';
-- 提交事务
COMMIT;
-- 回滚事务
rollback;

回滚事务 只能是针对未提交的事务进行回滚,已提交的事务 是不能回滚。

事务的四大特性(记忆)

  • 原子性(Atomicity):事务时不可分隔的最小的操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致的状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作的影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,他对数据库中的改变时永久的。

四大特性简称为ACID。

并发事务问题

  1. 脏读:一个事务读到另外一个事务还没有提交的数据
    在这里插入图片描述
    例:B取到了A提交的数据

  2. 不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同,称之为不可重复
    在这里插入图片描述

  3. 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据的时候,又发现这行数据已经 存在,好像出现了“幻影”
    在这里插入图片描述

事务的隔离级别

为了解决事务并发所引起的问题
在这里插入图片描述
1 查看事务的隔离级别

-- 查看事务的隔离级别
select @@TRANSACTION_ISOLAtion;

2 设置事务的隔离级别

set[session | global] TRANSACTION ISOLAtion LEVEL{Read uncommitted|Read committed|Repeatable read|Serializable}

注意:事务的隔离级别越高,数据越安全,但是性能越低。一般情况下,我们采用数据库的默认的隔离级别,不会自己设置隔离级别

数据库的设计(理解)

数据库设计三范式

设计范式:设计表的依据,按照这三个范式设计出来的表,不会出现数据的冗余。

三范式

第一范式:任何一张表都应该右主键,并且每一个字段原子性不可再分。

通俗讲 一个字段只能存储一项信息。
不符合第一范式的例子:
在这里插入图片描述

存在的问题:

  • 最后一条记录和第二条记录重复(不唯一 没有主键)
  • 联系方式字段可以再分,不是原子结构
第二范式:建立在第一范式的基础上的,要求所有的非主键字段完全依赖主键,不能产生部分依赖。

简单来说,任意一个字段都只能依赖表中的同一个字段
在这里插入图片描述

解决办法:多对多 需要创建一个中间表 通过他来关联学生表和教师表

第三范式:建立在第二范式的基础之上的,所有的非主键字段直接依赖主键,不能产生传递依赖

在这里插入图片描述
通俗来讲:一张表最多只中存在两层不同类型的信息
解决办法:一对多两张表 在多方表添加外键

数据库表的经典的设计方案

一对一怎么设计?
第一种方案:主键共享
用户表和用户详细信息表
在这里插入图片描述

反三范式

没有冗余的数据库未必时最好,有时为了提高运行效率,提高的性能,就必须降低范式的标准,适当的保留冗余数据。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值