• MySQL数据库之事务


    事务

    • 概述

      • 事务(TRANSACTION)是一个整体,要么一起执行,要么一起不执行
    • 事务特性:事务必须具备以下四个属性,简称ACID 属性

      • 原子性(Atomicity)
        • 事务是一个完整的操作
        • 事务的各步操作是不可分的(原子的)
        • 要么都执行,要么都不执行
      • 一致性(Consistency)
        • 当事务完成时,数据必须处于一致状态
      • 隔离性(Isolation)
        • 对数据进行修改的所有并发事务是彼此隔离的
      • 永久性(Durability)
        • 事务完成后,它对数据库的修改被永久保持

    更改定界符 delimiter

    • 一般情况下的定界符

      • 其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了
      • 默认情况下,delimiter是分号;
      • 在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令
    • 可能输入较多的语句,且语句中包含有分号时的定界符设置

      • 默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句
      • 因为mysql一遇到分号,它就要自动执行
      • 这种情况下,就需要事先把delimiter换成其它符号,如//或$$
    MariaDB [sel]> create table bank(
        -> card char(4) primary key comment '卡号',
        -> money decimal(10,2) not null
        -> )charset=utf8;
    # `Query OK, 0 rows affected (0.023 sec)`
    
    MariaDB [sel]> insert into bank values ('1001',1000),('1002',10);
    # `Query OK, 2 rows affected (0.012 sec)`
    # `Records: 2  Duplicates: 0  Warnings: 0`
    
    MariaDB [sel]> begin;
    # `Query OK, 0 rows affected (0.000 sec)`
    
    MariaDB [sel]> delimiter //
    MariaDB [sel]> update bank set money=money-100 where card='1001';
        -> update bank set money=money+90 where card='1002'//
    # `Query OK, 1 row affected (0.008 sec)`
    # `Rows matched: 1  Changed: 1  Warnings: 0`
    
    Query OK, 1 row affected (0.008 sec)
    # `Rows matched: 1  Changed: 1  Warnings: 0`
    
    MariaDB [sel]> rollback //
    # `Query OK, 0 rows affected (0.008 sec)`
    
    MariaDB [sel]> select * from bank //
    +------+---------+
    | card | money   |
    +------+---------+
    | 1001 | 1000.00 |
    | 1002 |   10.00 |
    +------+---------+
    # `2 rows in set (0.000 sec)`
    

    事务处理

    • 相关指令

      • 开启事务 start transactionbegin [work]
      • 提交事务 commit
      • 回滚事件 rollback
      • 记录事务的回滚点 savepoint 锚点
    • 自动提交事务

      • 每一个SQL语句都是一个独立的事务
    • 事务生命周期

      • 事务是事务开启的时候开始
      • 提交事务、回滚事务后事务都结束
      • 只有innodb支持事务
      • 一个SQL语句就是一个独立的事务,开启事务是将多个SQL语句放到一个事务中执行

    事务处理提交

    MariaDB [sel]> start transaction //
    # `Query OK, 0 rows affected (0.000 sec)`
    
    MariaDB [sel]> update bank set money=money-100 where card='1001';
        -> update bank set money=money+90 where card='1002'//
    # `Query OK, 1 row affected (0.007 sec)`
    # `Rows matched: 1  Changed: 1  Warnings: 0`
    
    # `Query OK, 1 row affected (0.008 sec)`
    # `Rows matched: 1  Changed: 1  Warnings: 0`
    
    MariaDB [sel]> commit //
    # `Query OK, 0 rows affected (0.008 sec)`
    
    MariaDB [sel]> select * from bank //
    +------+--------+
    | card | money  |
    +------+--------+
    | 1001 | 900.00 |
    | 1002 | 100.00 |
    +------+--------+
    # `2 rows in set (0.000 sec)`
    

    事务处理回滚

    MariaDB [sel]> begin //
    # `Query OK, 0 rows affected (0.000 sec)`
    
    MariaDB [sel]> insert into bank values ('1003',500) //
    # `Query OK, 1 row affected (0.007 sec)`
    
    MariaDB [sel]> savepoint a1 //
    # `Query OK, 0 rows affected (0.000 sec)`
    
    MariaDB [sel]> insert into bank values ('1004',500) //
    # `Query OK, 1 row affected (0.000 sec)`
    
    MariaDB [sel]> rollback to a1 //
    # `Query OK, 0 rows affected (0.000 sec)`
    
    MariaDB [sel]> select * from bank //
    +------+--------+
    | card | money  |
    +------+--------+
    | 1001 | 900.00 |
    | 1002 | 100.00 |
    | 1003 | 500.00 |
    +------+--------+
    # `3 rows in set (0.000 sec)`
    
  • 相关阅读:
    第六周
    第五周(实验报告)
    第四周(实验报告)
    第三周(实验报告)
    Java第二周学习总结
    第一周
    2019课程总结
    第十四周课程总结
    第十三周总结
    第十二周总结
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14137985.html
Copyright © 2020-2023  润新知