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)`
posted @ 2020-12-15 13:18  wing1377  阅读(91)  评论(0编辑  收藏  举报