• Mysql数据库 16.SQL语言 数据库事务


    一、数据库事务

    数据库事务介绍——要么全部成功要么全部失败

    我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务

    事务——就是完成同一个业务的多个DML操作

    例:

    数据库事务四大特性

    原子性(A):一个事务中的多个DML操作,要么同时执行成功,要么同时失败

    一致性(C):事务执行之前和事务执行之后,数据库中的数据是一致的,完整性和一致性不能被破坏

    隔离性:数据库允许多个事务同时执行,多个并发的事物之间不能发生影响

    持久性:事务完成之后,对数据库的操作是永久的

    二、MySQL事务管理(应用)

    1.自动提交

    在Mysql中,默认DML指令执行自动提交,当我们执行一个DML语句后,自动同步到数据库中

    用sql语句执行后,先短暂进入一个缓存区域,检查语句是否正确,然后再对数据空间进行改变

    2.事务管理

    开启事务,就是关闭自动提交,在缓存区域进行检查,如果检查正确,则可以正确提交,对数据空间进行修改

    2.1 开启事务:start transaction

    2.2 依次执行事务中的每个操作

    2.3 如果在执行的过程中的任何位置出现异常,则执行rollback回滚事务,将缓存区域保存的语句直接删除

    2.4 如果食物中所有的DML操作都执行成功,则在最后执行commit提交事务,在数据库中进行数据改变

    3.案例

    1.创建数据库

    create databases 数据库名;

    create database db_test3;

    2.使用数据库

    use 数据库名;

    use db_test3;

    3.创建库存表

    create table 表名(字段名...);

    1. create table stock(
    2. id int primary key auto_increment,
    3. name varchar(20),
    4. num int not null
    5. );

    4.创建订单表

    create table 表名(字段名...);

    1. create table order_db(
    2. id int primary key auto_increment,
    3. name varchar(200) not null,
    4. price double,
    5. num int
    6. );

    5.给库存表中添加数据

    insert into 表名(字段名) values (字段对应的数据);

    1. insert into stock(name,num)
    2. values(
    3. '鼠标',10
    4. );

    5.创建订单表

    insert into 表名(字段名) values (字段对应的数据);

    1. create table order_db(
    2. id int primary key auto_increment,
    3. name varchar(200) not null,
    4. price double,
    5. num int
    6. );

    5.给库存表中添加数据

    1. insert into stock(name,num)
    2. values(
    3. '鼠标',10
    4. );
    5. insert into stock(name,num)
    6. values(
    7. '键盘',20
    8. );
    9. insert into stock(name,num)
    10. values(
    11. '耳机',30
    12. );

        

    6.如果不加入事务进行回滚则会执行前半部分语句,后半部分语句错误则不会通过

    1. #扣减库存
    2. #{
    3. update stock set num=num-1 where name='键盘';
    4. #如果不加入事务进行回滚则会执行前半部分语句,后半部分语句错误则不会通过
    5. select aaa;
    6. #订单加1
    7. insert into order_db(name,price,num) values('键盘',50,1);

    7.开启事务 将自动提交改为手动提交

    start transaction;

    start transaction;

    开启事务后的运行结果

    开启事务后,如果不成功则两段都不会运行

    rollback 事务回滚:消除缓存中的操作,撤销当前事务已经执行的操作

    commit 手动提交

    三、四种事务隔离级别

    1.读未提交 2.读已提交 3.可重复读 4.单行化

    隔离级别依次递增

    1.读未提交 read uncommited

    读未提交:一个事务中读到了另一个事务中修改了但未提交的数据,会造成数据的差别,产生了不一致性

    2.读已提交  read commited

    读已提交:避免了脏读但是会导致虚读,在多次查询之间修改了数据,导致多次查询的结果不同

    3.可重复读 repeatable read

    可重复读:在第一次操作完全结束之前,不能被其他事务影响,避免了不可重复读,但可能会造成幻读,在查询时,第二次修改后查询出的结果和第一个事务又往前递增,就会查询出修改前修改后的两个数据,会出现所谓的幻读

    4.单行化 serializable

    串行化:同时只允许一个事务对数据进行操作,避免了脏读、虚读、幻读

    5.设置数据库事务隔离级别

    6.查看数据库默认的隔离级别

    select @@transaction_isolation;

    select @@transaction_isolation;

    7.设置数据库隔离级别

    set session transaction isolation level 事务隔离级别 ;

    set session transaction isolation level read committed ;

    越往后等级越高,之后的是为了解决前一级别遇到的问题

  • 相关阅读:
    C++day7
    [Java安全]—Mybatis注入
    Python零基础速成班-第17讲-Python for Pandas Series对象,DataFrame对象和性质,统计分析及排序运
    设计模式课件
    3dmax如何在渲染完之后加载VFB的参数和LUT文件?
    C程序函数调用&系统调用
    JS Map与weakMap
    java计算机毕业设计网络招聘系统源码+系统+数据库+lw文档+mybatis+运行部署
    python 脏话处理、特殊词汇过滤!
    计算机竞赛 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测
  • 原文地址:https://blog.csdn.net/m0_73983707/article/details/134379104