Mysql学习笔记第七章—事务

事务

1.事务概述

  • 事务是一个完整的业务逻辑单元,不可再分。

  • 例如:银行账户转账,从用户actno-001向actno-002转账10000,需要执行两条update语句

    update t_act set balance = balance - 10000 where actno='actno-001';
    update t_act set balance = balance + 10000 where actno='actno-002';
    

    以上两条语句必须同时成功或者同时失败,就需要使用数据库中的“事务机制”。

  • 和事务有关系的语句:DML语句(insert delete update)。

  • 事务执行过程:

    开启事务机制→执行事务中操作,不会与文件交互,而是保存导数据库的操作历史中→提交事务/回滚事务

  • 提交事务:commit

    回滚事务:rollback

  • 事务特性ACID:

    A:原子性:事务是最小的工作单元,不可再分。

    C:一致性:事务必须保证多条DML语句同时成功/失败

    I:隔离性:事务A和事务B之间具有隔离

    D:持久性:持久性指的是最终数据必须持久化导硬盘文件中,事务才算成功结束。

  • 事务之间的隔离性,理论上隔离级别包括4个:

    第一级别:读未提交(read uncommitted)

    ​ 对方事务还未提交,当前事务可以读到对方未提交的数据。读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据

    第二级别:读已提交(read committed)

    ​ 解决了脏读现象。对方事务提交之后的数据,当前事务可以读取到。但不可重复读。

    第三级别:可重复读(repeatable read)

    ​ 解决了不可重复读问题。但读到的数据是幻想

    第四级别:序列化读/串行化读

    ​ 解决了多有问题。效率低,需要事务排队。

  • 注:mysql数据库默认的隔离级别是:可重复读。

    ​ oracle数据库默认的隔离级别是:读已提交。

2.演示事务

  • mysql事务默认的情况下是自动提交的
#准备表
mysql> drop table if exists t_user;
mysql> create table t_user(
    -> id int primary key auto_increment,
    -> username varchar(255)
    -> );
#演示
#插入一条数据
mysql> insert into t_user(username) value('zs');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | zs       |
+----+----------+
#回滚
mysql> rollback;
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | zs       |
+----+----------+
  • 关闭自动提交:start transaction
#关闭自动提交
mysql> start transaction;
#插入记录
mysql> insert into t_user(username) values('ice');
mysql> insert into t_user(username) values('coffee');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | zs       |
|  2 | ice      |
|  3 | coffee   |
+----+----------+
#回滚
mysql> rollback;
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | zs       |
+----+----------+
#rollback事务已经结束。
#测试提交事务
mysql> start transaction;
#插入数据
mysql> insert into t_user(username) values('ice');
mysql> insert into t_user(username) values('coffee');
mysql> commit;
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | zs       |
|  4 | ice      |
|  5 | coffee   |
+----+----------+

学习视频:动力节点MySQL基础入门到精通

你可能感兴趣的:(咖啡ice的MySQL学习记录,mysql,学习,笔记)