事务
事务是一组操作的集合,他是不可分隔的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤
销操作请求。这些操作要么同时成功,要么同时失败。
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。
并发事务问题
-
脏读:一个事务读到另外一个事务还没有提交的数据
例:B取到了A提交的数据 -
不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同,称之为不可重复
-
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据的时候,又发现这行数据已经 存在,好像出现了“幻影”
事务的隔离级别
为了解决事务并发所引起的问题
1 查看事务的隔离级别
-- 查看事务的隔离级别
select @@TRANSACTION_ISOLAtion;
2 设置事务的隔离级别
set[session | global] TRANSACTION ISOLAtion LEVEL{Read uncommitted|Read committed|Repeatable read|Serializable}
注意:事务的隔离级别越高,数据越安全,但是性能越低。一般情况下,我们采用数据库的默认的隔离级别,不会自己设置隔离级别
数据库的设计(理解)
数据库设计三范式
设计范式:设计表的依据,按照这三个范式设计出来的表,不会出现数据的冗余。
三范式
第一范式:任何一张表都应该右主键,并且每一个字段原子性不可再分。
通俗讲 一个字段只能存储一项信息。
不符合第一范式的例子:
存在的问题:
- 最后一条记录和第二条记录重复(不唯一 没有主键)
- 联系方式字段可以再分,不是原子结构
第二范式:建立在第一范式的基础上的,要求所有的非主键字段完全依赖主键,不能产生部分依赖。
简单来说,任意一个字段都只能依赖表中的同一个字段
解决办法:多对多 需要创建一个中间表 通过他来关联学生表和教师表
第三范式:建立在第二范式的基础之上的,所有的非主键字段直接依赖主键,不能产生传递依赖
通俗来讲:一张表最多只中存在两层不同类型的信息
解决办法:一对多两张表 在多方表添加外键
数据库表的经典的设计方案
一对一怎么设计?
第一种方案:主键共享
用户表和用户详细信息表
反三范式
没有冗余的数据库未必时最好,有时为了提高运行效率,提高的性能,就必须降低范式的标准,适当的保留冗余数据。