前言
哈喽各位看官们,小tu又又又来了!
今天这篇博文是MySQL学习的最后一篇博文,而今天的主要内容就是咱们的 TCL——事务了,事务起着一个什么样的作用呢,通俗地讲,事务的作用就是在许多人同时访问一个数据库的时候能够使数据不混乱,能够更正用户的修改,这仅仅是博主自己的理解,各位读者们还可以自己学习事务进行深入理解。
要是觉得博主写得还不错的,记得读完后一键三连哦~ 蟹蟹!
TCL
事务的定义
含义:Transaction Control Language 事务控制语言
事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
事务的特性:ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据.
事务的创建
隐式事务:
- 事务没有明显的开启和结束的标记
- 比如insert、update、delete语句
显式事务:
-
事务具有明显的开启和结束的标记
-
步骤:
前提:必须先设置自动提交功能为禁用
set autocommit=0;
步骤1:开启事务
set autocommit=0; start transaction;可省略
步骤2:编写事务中的sql语句(select insert update delete)
语句1; 语句2; ...
步骤3:结束事务
commit;提交事务 rollback;回滚事务 根据情况二选一
补充:savepoint 节点名;设置保存点
代码举例:SET autocommit=0; START TRANSACTION; DELETE FROM account WHERE id=25; SAVEPOINT a;#设置保存点 DELETE FROM account WHERE id=28; ROLLBACK TO a;#回滚到保存点
事务的隔离
事务的隔离级别:
脏读 重复读 幻读
read uncommitted: √ √ √
read committed: × √ √
repeatable read: × × √
serializable × × ×
补充内容:
-
mysql中默认 第三个隔离级别 repeatable read
-
oracle中默认第二个隔离级别 read committed
-
查看隔离级别
select @@tx_isolation;
-
设置隔离级别
set session|global transaction isolation level 隔离级别;
代码举例:
演示事务对于 delete 和 truncate 的处理的区别
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
数据库三大范式
-
第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。
-
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
-
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
这里的文字读起来是有些难懂,这里给看官们推荐一个网址,可以很好地理解三大范式的内容
关系型数据库设计:三大范式的通俗理解
事务面试题
事务是什么?
事务是一系列的数据库操作,是数据库应用的基本单位。MySQL 事务主要用于处理操作量大,复杂度高的数据。
事务有哪些特性?
在 MySQL 中只有 InnDB 引擎支持事务,它的四个特性如下:
- 原子性(Atomic):要么全部执行,要么全部不执行;
- 一致性(Consistency):事务的执行使得数据库从一种正确状态转化为另一种正确状态;
- 隔离性(Isolation):在事务正确提交之前,不允许把该事务对数据的任何改变提供给其他事务;
- 持久性(Durability):事务提交后,其结果永久保存在数据库中。
MySQL 中有几种事务隔离级别?分别是什么?
MySQL 中有四种事务隔离级别,它们分别是:
- read uncommited:未提交读,读到未提交数据;
- read committed:读已提交,也叫不可重复读,两次读取到的数据不一致;
- repetable read:可重复读;
- serializable:串行化,读写数据都会锁住整张表,数据操作不会出错,但并发性能极低,开发中很少用到。
MySQL 默认使用 REPEATABLE-READ 的事务隔离级别。
幻读和不可重复读的区别?
不可重复读的重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样。(因为中间有其他事务提交了修改)。
幻读的重点在于新增或者删除:在同一事务中,同样的条件,,第一次和第二次读出来的记录数不一样。(因为中间有其他事务提交了插入/删除)。
学无止境 |