数据库进阶 の 事务
文章目录
sqlserver 数据库只能安装在 window
服务器上
1.数据库存储方式
- 数据放到表里,表再放到库中
- 一个数据库中可以有多个表,每个表都有一个名字,表明唯一性
- 一列叫
属性
2.事务
一组SQL 语句组成的执行单元,我们叫做事务。要么全部执行,要么全部不执行。
存储引擎,指的是数据用不同的技术,将数据储存在文件中,可以通过 show engines
来查看 mysql
支持的存储引擎。其中 innodb
支持事务性的,其他的不支持事务。
1. 事务的 ACID
属性
- 原子性:要么都执行,要么都不执行
- 一致性:从一个状态变到另一个一致性的状态,要保持一致性
- 隔离性:一个事务的执行,不能被另一个事务干扰,并发执行的各个事务之间,是不能互相干扰的
- 持久性:事务一旦被提交,他就是一个永久的事。比如你从数据库里删除一个字段,然后还能通过回滚再把这个字段找回来吗?
当然不能
2.事务的开始和结束
2.1 隐式事务
隐式事务指的是没有明显的开启和结束的表示
比如: insert,update ,delete
2.2 显示事务
显示事务即有明显的开启和结束:
前提是必须将自动提交功能设为禁用
set autocomit=0;
显示事务提交的过程
步骤一: 开启事务
set autocommit=0;
start transaction ; 可选的,上一行执行了,这一行自然就有了
步骤二.编写事务的sql语句
语句1;
语句2;
语句3;
....
语句4;
commit; 提交事务
rollback; 事务回滚
3.隔离机制
当多个用户并发地存取数据库的时候,就会产生多个事务,同时存取同一数据的情况。若对。并发操作不加控制,就会存取和存储不正确的数据,破坏事务的一致性和数据库的一致性。所以数据库管理系统,必须提供并发控制机制,并发控制机制,是衡量一个数据库管理系统性能的标志之一
事务是并发控制的基本单位
3.1并发导致的问题
1.丢失修改
事务 A 和事务 B 对同一数据进行了修改,B 事务的提交,破坏了 A 提交的交过,导致 A 的修改丢失。
2.不可重复读
事务 A 读取了某一数据,然后事务 B 对数据进行了修改,而后事务A 再读这个数据,就和第一读到的不一样了
不可重复读,如果是对数据操作的话,多了一部分数据,或者少了一部分数据,这种不可重复读称作 幻影现象
3.读脏数据
事务 A 修改了某一数据,事务 B 读了这一数据,而后,事务 A 因为某些原因撤销了,(不一定是回滚),那么事务 B 读到的就是脏数据。简单点来说,就是事务A 读取了未提交的数据。
3.2加锁
排他锁
,也叫写锁
简称X锁
,即事务 A 读数据对象加上X
锁以后,只能有事务 A 完成读取和修改操作,其他任何事物在此期间,都不能再加任何类型的锁,直到T
释放为停止。共享锁
, 又叫读锁
,简称S锁
,即事务 A 可以对对象添加S 锁
,则其他事务就只能再添加S锁
,而不能添加X锁
。
3.3 数据库的四种隔离级别
1.读未提交(read uncommitted )
允许读取未被其他事务提交的变更,此时脏读不可读都会出现
2.读已提交(read committed)
只允许读取已经被提交的事务,可以避免脏读,但是不可避免重复读和幻影的问题
3.可重复读(repeatable read)
保证事务可以多次在同一字段中读取到相同的值,这个事务持续期间,禁止其他事务对这个事务进行更新,可以避免脏读和不可重复读,但是幻读的问题依然存在。
4.串行化(serializable)
确保事务可以读取到相同的数据,在事务持续的过程中,禁止其他事务对
表
的增加,删除,和更新。
Oriacl 支持两种事务隔离级别,Mysql 支持四种隔离级别,默认的隔离级别为 可重复度
4.回滚点
savepoint a; // 保存 a 为回滚点
rollback to a; // 回滚到 a 点
5.视图
视图就相当于是一组 SQL
语句,他就可以把这些个复杂的查询,放到一个视图里面
举个简单的例子,比如某高中一共有 12
个班,突然某天省里的领导要来检查,那么就要将班里的 所有语文成绩80分以上的,数学120以上的,男生同学,组成一个班,临时组成,那么这样的话,原本的12班,就变成了13个班,但是最后的这个班实际上是不存的,但是我们用的时候,可以直接拿这班当一个真正的班来写 SQL
语句。
参考资料
https://www.bilibili.com/video/BV12b411K7Zu?p=139&share_source=copy_web