【Mysql】七、Mysql基础篇 --- 事务和视图

事务、视图篇

      • 一、事务
        • 1、事务的四大特点(ACID)
        • 2、事务的使用步骤
        • 3、事务并发
      • 二、视图

一、事务

一组sql组成一个执行单元,这些sql要么都执行,要么都不执行;执行中报错了,都不执行,回滚之前的修改内容

1、事务的四大特点(ACID)
  1. 原子性:

事务是最小的单元,内部的sql都不可再分割执行,要么都执行成功,要么都执行失败

  1. 一致性:

事务修改之后的数据,保持一致。举例:两个账户转账,执行成功后金额与转账之前的总额保持一致。

  1. 隔离性:

事务之间的是相互隔离,互不干扰

  1. 持久性:

事务一旦提交,不可撤回

2、事务的使用步骤
-- 查看是否开启自动提交
SHOW VARIABLES LIKE 'autocommit'

-- 1. 关闭自动提交(默认开启事务)
SET autocommit = 0;
START TRANSACTION; -- 此句可选
-- 2. 执行的sql语句
UPDATE account SET balance = 100 WHERE user_id = 1;
UPDATE account SET balance = 150 WHERE user_id = 2;
-- 3.提交事务
COMMIT;
-- 4.回滚事务
ROLLBACK;

delete、truncate回滚策略

-- DELETE会被事务回滚
SET autocommit=0
DELETE FROM users;
ROLLBACK;

-- TRUNCATE删除表操作不会被事务回滚
SET autocommit=0
TRUNCATE TABLE users;
ROLLBACK
3、事务并发
  1. 隔离级别
    mysql支持四种隔离级别:

Read Uncommitted(读取未提交内容,读取到的数据是未commit的修改内容,称之为脏读

Read Committed(读取提交内容,此时再同一事务内两个相同查询,产生不同的数据行,导致数据不一致)

Repeatable Read(可重读,它确保同一事务的多个实例在读取数据时,会看到同样的数据,显示的都是commit之前或者之后的同一数据,此时后出现幻读而会因为另一事务修改后,本次事务也提交,再执行一样的查询,结果与再事务内的数据不一致)

Serializable( 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争)

oracel隔离级别:

Read committed 和 Serializable

  1. 隔离级别展示

脏读:事务A第一次读取A表内容,此时事务B修改了A表的数据,并且提交,此时事务A再次读取A表内容,此时第一次查询A表内容和第二次查询结果不等。
不可重复读:事务A再未提交之前,由于另一事务修改了内容,导致再事务A再本次事务内执行同一查询,但是结果不相同
幻读:事务A事务内多次的同一查询结果相等,但是提交之后,查询的结果与再事务中的查询结果集不等。多出现与插入,隔离级别过低,两个修改数据可能会干扰到另一事务修改的行,,导致多修改或则少修改,,Serializable隔离级别时,另一修改会加锁等待。

隔离级别 脏读 不可重复读 幻读
Read Uncommitted
Read Committed
Repeatable Read
Serializable
  1. 查看默认隔离级别
    8.0以下版本:select @@tx_isolation;
    8.0+的版本:
    select @@transaction_isolation
    【Mysql】七、Mysql基础篇 --- 事务和视图_第1张图片
    show variables like 'transaction_isolation';
    【Mysql】七、Mysql基础篇 --- 事务和视图_第2张图片
    默认的隔离级别为:REPEATABLE-READ

  2. 设置隔离级别

-- 设置当前连接的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE
-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE

二、视图

个人觉得画蛇添足,没有必要,反而会增加代码阅读的难度

视图创建只是保存sql的查询逻辑,并不会占用存储空间

-- 创建视图
CREATE VIEW my_view
AS
SELECT username FROM users WHERE id = 17

-- 查询视图
SELECT * FROM my_view

-- 修改视图 1
CREATE OR REPLACE VIEW my_view
AS
SELECT username,age FROM users WHERE id = 17

-- 修改视图 2
ALTER VIEW my_view
AS
SELECT username,age,id FROM users WHERE id = 17

-- 删除视图
DROP VIEW my_view

-- 查看视图结构
DESC my_view

你可能感兴趣的:(数据库,mysql,数据库,sql)