• MySQL——事务和视图


    2023.9.17

            本章开始介绍TCL语言(Transaction Control Language 事务控制语言)。

    事务

    事务的概念:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

    事务的特性:(ACID)

    • 原子性:一个事务不可再分割,要么都执行要么都不执行。
    • 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态。
    • 隔离性:一个事务的执行不受其他事务的干扰。
    • 持久性:一个事务一旦提交,则会永久的改变数据库的数据。

    事务的创建及使用步骤:
            隐式事务:事务没有明显的开启和结束的标记,如insert、update、delete语句。

            显式事务:事务具有明显的开启和结束的标记。前提:必须先设置自动提交功能为禁用。

    步骤1:开启事务

    set autocommit=0;
    start transaction;(可选)


    步骤2:编写事务中的sql语句(select insert update delete)

    语句1;
    语句2;
    ...

     步骤3:结束事务 

    commit;提交事务
    rollback;回滚事务 

    savepoint 的使用案例:

    1. SET autocommit=0;
    2. START TRANSACTION;
    3. DELETE FROM account WHERE id=25;
    4. SAVEPOINT a;#设置保存点
    5. DELETE FROM account WHERE id=28;
    6. ROLLBACK TO a;#回滚到保存点

    数据库的隔离级别:

            对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

    • 脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
    • 不可重复读:对于两个事务T1, T2,T1读取了一个字段,然后T2更新了该字段。之后, T1再次读取同一个字段,值就不同了。
    • 幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。

            各个隔离级别:

                                         脏读        不可重复读    幻读
    read uncommitted:     √                  √                √
    read committed:          ×                 √                √
    repeatable read:          ×                  ×               √
    serializable:                 ×                  ×               ×

    mysql中默认 第三个隔离级别 repeatable read
    oracle中默认 第二个隔离级别 read committed
    查看隔离级别:

    select @@tx_isolation;

    设置隔离级别:

    set session|global transaction isolation level 隔离级别;


    视图:

    含义:可以理解为一张虚拟表,和普通表一样使用,用于保存一些临时表数据,方便再次使用。
    mysql5.1版本出现的新特性,是通过表动态生成的数据。

    视图与表的对比:

                创建语法的关键字     是否实际占用物理空间                       使用

    视图     create view         只是保存了sql逻辑(数据没有保存)      增删改查,只是一般不能增删改

    表        create table           保存了数据                                             增删改查

    视图的好处:
    ①重用sql语句。
    ②简化复杂的sql操作,不必知道它的查询细节。
    ③保护数据,提高安全性。

    相关笔记:

    1. #一、创建视图
    2. /*
    3. 语法:
    4. create view 视图名
    5. as
    6. 查询语句;
    7. */
    8. #1.查询姓名中包含a字符的员工名、部门名和工种信息
    9. #创建视图
    10. CREATE VIEW v1
    11. AS
    12. SELECT `last_name`,`department_name`,`job_title`
    13. FROM `employees` e
    14. INNER JOIN `departments` d ON e.`department_id`=d.`department_id`
    15. INNER JOIN `jobs` j ON j.`job_id`=e.`job_id`;
    16. #使用视图
    17. SELECT * FROM v1 WHERE `last_name` LIKE '%a%';
    18. #2.查询各部门的平均工资级别
    19. #创建视图查看每个部门的平均工资
    20. CREATE VIEW v2
    21. AS
    22. SELECT AVG(`salary`) ag ,`department_id`
    23. FROM `employees`
    24. GROUP BY `department_id`;
    25. #使用视图
    26. SELECT v2.ag,g.`grade_level`
    27. FROM v2
    28. INNER JOIN `job_grades` g
    29. ON v2.ag BETWEEN g.`lowest_sal` AND g.`highest_sal`;
    30. #3.查询平均工资最低的部门信息
    31. #利用刚刚生成的视图v2
    32. SELECT * FROM v2 ORDER BY ag ASC LIMIT 1;
    33. #4.查询平均工资最低的部门名和工资
    34. #视图可以套娃
    35. CREATE VIEW v3
    36. AS
    37. SELECT * FROM v2 ORDER BY ag ASC LIMIT 1;
    38. SELECT d.`department_name`,v.ag
    39. FROM v3 v
    40. INNER JOIN `departments` d
    41. ON v.`department_id`=d.`department_id`;
    42. #二、视图的修改
    43. #方式一:
    44. /*
    45. create or replace view 视图名
    46. as
    47. 查询语句;
    48. */
    49. CREATE OR REPLACE VIEW myv3
    50. AS
    51. SELECT AVG(salary),job_id
    52. FROM employees
    53. GROUP BY job_id;
    54. #方式二:
    55. /*
    56. 语法:
    57. alter view 视图名
    58. as
    59. 查询语句;
    60. */
    61. ALTER VIEW myv3
    62. AS
    63. SELECT * FROM employees;
    64. #三、删除视图
    65. /*
    66. 语法:drop view 视图名,视图名,...;
    67. */
    68. DROP VIEW v1,v2,v3;
    69. #四、查看视图
    70. DESC myv3;
    71. SHOW CREATE VIEW myv3;
    72. #五、视图的更新
    73. CREATE OR REPLACE VIEW myv1
    74. AS
    75. SELECT last_name,email
    76. FROM employees;
    77. #1.插入
    78. INSERT INTO myv1 VALUES('张飞','zf@qq.com');
    79. #2.修改
    80. UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
    81. #3.删除
    82. DELETE FROM myv1 WHERE last_name = '张无忌';
    83. #具备以下特点的视图不允许更新
    84. #①包含以下关键字的sql语句:分组函数、distinctgroup byhavingunion或者union all
    85. CREATE OR REPLACE VIEW myv1
    86. AS
    87. SELECT MAX(salary) m,department_id
    88. FROM employees
    89. GROUP BY department_id;
    90. SELECT * FROM myv1;
    91. #更新
    92. UPDATE myv1 SET m=9000 WHERE department_id=10;
    93. #②常量视图
    94. CREATE OR REPLACE VIEW myv2
    95. AS
    96. SELECT 'john' NAME;
    97. SELECT * FROM myv2;
    98. #更新
    99. UPDATE myv2 SET NAME='lucy';
    100. #③Select中包含子查询
    101. CREATE OR REPLACE VIEW myv3
    102. AS
    103. SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
    104. FROM departments;
    105. #更新
    106. SELECT * FROM myv3;
    107. UPDATE myv3 SET 最高工资=100000;
    108. #④join
    109. CREATE OR REPLACE VIEW myv4
    110. AS
    111. SELECT last_name,department_name
    112. FROM employees e
    113. JOIN departments d
    114. ON e.department_id = d.department_id;
    115. #更新
    116. SELECT * FROM myv4;
    117. UPDATE myv4 SET last_name = '张飞' WHERE last_name='Whalen';
    118. INSERT INTO myv4 VALUES('陈真','xxxx');
    119. #⑤from一个不能更新的视图
    120. CREATE OR REPLACE VIEW myv5
    121. AS
    122. SELECT * FROM myv3;
    123. #更新
    124. SELECT * FROM myv5;
    125. UPDATE myv5 SET 最高工资=10000 WHERE department_id=60;
    126. #⑥where子句的子查询引用了from子句中的表
    127. CREATE OR REPLACE VIEW myv6
    128. AS
    129. SELECT last_name,email,salary
    130. FROM employees
    131. WHERE employee_id IN(
    132. SELECT manager_id
    133. FROM employees
    134. WHERE manager_id IS NOT NULL
    135. );
    136. #更新
    137. SELECT * FROM myv6;
    138. UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';

  • 相关阅读:
    Springboot启动流程
    Linux 日志管理
    HCM系统的五大功能
    Linux安装Anaconda(Anaconda3-2022.10-Linux-x86_64.sh版本)
    使用OpenCVSharp利用PictrueBox对接摄像头获取视频图像
    Hyperf微服务——五、JsonRpc远程调用
    ZYNQ图像处理项目——线性神经网络识别mnist
    Node.js、Chrome V8 引擎、非阻塞式I/O介绍
    抖音微短剧小程序源码搭建:实现巨量广告数据高效回传
    2022 计网复习简答题【太原理工大学】
  • 原文地址:https://blog.csdn.net/m0_61028090/article/details/132945200