From bd63f88ac1e46084225b674da926d845e3a5a065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90?= <11785189+beckoningchen@user.noreply.gitee.com> Date: Fri, 20 Oct 2023 03:04:02 +0000 Subject: [PATCH] 14 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈新成 <11785189+beckoningchen@user.noreply.gitee.com> --- .../20231019.md" | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 "14 \351\231\210\346\226\260\346\210\220/20231019.md" diff --git "a/14 \351\231\210\346\226\260\346\210\220/20231019.md" "b/14 \351\231\210\346\226\260\346\210\220/20231019.md" new file mode 100644 index 0000000..6a4c5e9 --- /dev/null +++ "b/14 \351\231\210\346\226\260\346\210\220/20231019.md" @@ -0,0 +1,146 @@ +# 笔记 + +事务 + +数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。 + +一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。 + +事务的几个特性(ACID) + +  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。 + +   2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。其实一致性也是因为原子型的一种表现 + +   3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。串行化 + +   4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚 + + + +```mysql +脏读 +一个事务在执行的过程中读取到了其他事务还没有提交的数据。 这个还是比较好理解的。 + +读已提交 +从字面上我们就可以理解,即一个事务操作过程中可以读取到其他事务已经提交的数据。 + +事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(相当于当前读) + +不可重复读 +在同一事务中,多次读取同一数据返回的结果有所不同,换句话说,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读” 在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。 +可重复读 +一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的。 + +幻读 +脏读、不可重复读、可重复读、幻读,其中最难理解的是幻读 +7、事务的隔离级别 +隔离级别分为4种: +读未提交:READ-UNCOMMITTED +读已提交:READ-COMMITTED +可重复读:REPEATABLE-READ +串行:SERIALIZABLE +``` + + + + + +```mysql +//设置不自动提交事务 +set autocommit=0; +//执行事务操作 +commit|rollback; +5、savepoint关键字 +savepoint part1;//设置一个保存点 +rollback to part1;//将savepint = part1的语句到当前语句之间所有的操作回滚 +``` + + + +```mysql +create table dept( + deptno int primary key auto_increment, -- 部门编号 + dname varchar(14) , -- 部门名字 + loc varchar(13) -- 地址 +) ; +-- 员工表 +create table emp( + empno int primary key auto_increment,-- 员工编号 + ename varchar(10), -- 员工姓名 - + job varchar(9), -- 岗位 + mgr int, -- 直接领导编号 + hiredate date, -- 雇佣日期,入职日期 + sal int, -- 薪水 + comm int, -- 提成 + deptno int not null, -- 部门编号 + foreign key (deptno) references dept(deptno) +); +insert into dept values(10,'财务部','北京'); +insert into dept values(20,'研发部','上海'); +insert into dept values(30,'销售部','广州'); +insert into dept values(40,'行政部','深圳'); +insert into emp values(7369,'刘一','职员',7902,'1980-12-17',800,null,20); +insert into emp values(7499,'陈二','推销员',7698,'1981-02-20',1600,300,30); +insert into emp values(7521,'张三','推销员',7698,'1981-02-22',1250,500,30); +insert into emp values(7566,'李四','经理',7839,'1981-04-02',2975,null,20); +insert into emp values(7654,'王五','推销员',7698,'1981-09-28',1250,1400,30); +insert into emp values(7698,'赵六','经理',7839,'1981-05-01',2850,null,30); +insert into emp values(7782,'孙七','经理',7839,'1981-06-09',2450,null,10); +insert into emp values(7788,'周八','分析师',7566,'1987-06-13',3000,null,20); +insert into emp values(7839,'吴九','总裁',null,'1981-11-17',5000,null,10); +insert into emp values(7844,'郑十','推销员',7698,'1981-09-08',1500,0,30); +insert into emp values(7876,'郭十一','职员',7788,'1987-06-13',1100,null,20); +insert into emp values(7900,'钱多多','职员',7698,'1981-12-03',950,null,30); +insert into emp values(7902,'大锦鲤','分析师',7566,'1981-12-03',3000,null,20); +insert into emp values(7934,'木有钱','职员',7782,'1983-01-23',1300,null,10); + +# 1、列出最低薪金大于1500的各种工作。 +select * from emp where sal>1500; +# 2、列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。 +select *from emp where deptno=(select deptno from dept where dname='销售部'); +# 3、列出薪金高于公司平均薪金的所有员工。 +with a as( +select empno,(sal+ifnull(comm,0)) x,avg(sal+ifnull(comm,0)) over () s from emp) +select * from a,emp where x>s and a.empno=emp.empno; +# 4、列出与"周八"从事相同工作的所有员工。 +select * from emp where job=(select job from emp where ename='周八'); +# 5、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 +with a as( +select *,(sal+ifnull(comm,0)) x from emp ), +b as +(select empno,(sal+ifnull(comm,0)) z from emp where deptno=30) +select a.* from a,b where a.empno=b.empno and x=z; +; +# 6、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 +with a as( +select *,(sal+ifnull(comm,0)) x from emp ), +b as +(select max((sal+ifnull(comm,0))) z from emp where deptno=30) +select a.* from a,b where x>z; +# 7、列出在每个部门工作的员工数量、平均工资、平均服务年限。 +with a as +(select deptno,avg(sal) 平均工资 ,avg(year(now())-year(hiredate)) 平均服务年限 from emp group by deptno), +b as +(select distinct deptno,count(*) over (partition by deptno) 员工数量 from emp) +select a.deptno,员工数量,平均工资,平均服务年限 from a,b where a.deptno=b.deptno; +; +# 8、列出所有员工的姓名、部门名称和工资。 +select ename 姓名,dname 部门名称,sal 工资 from emp,dept WHERE emp.deptno=dept.deptno; +# 9、列出所有部门的详细信息和部门人数。 +WITH a as ( +SELECT * from dept), +b as +(SELECT deptno,count(*) ovre (partition by deptno) s from emp) +SELECT a.*,b.s from a,b WHERE a.deptno=b.deptno; +; +# 10、列出各种工作的最低工资。 +SELECT DISTINCT job, MIN(sal) over (PARTITION by job) from emp; +# 11、列出各个部门的 经理 的最低薪金。 +SELECT DISTINCT d.dname,e.ename,e.job, MIN(sal)over(PARTITION by d.dname) from emp e,dept d where e.deptno=d.deptno and e.job='经理'; +# 12、列出所有员工的年工资,按年薪从低到高排序。 +SELECT *,(sal*12) 年工资 from emp ORDER BY 年工资 + + +``` + -- Gitee