事务

  1. 使用事务

    • 事务 transaction:将多个操作作为单个逻辑工作单元处理的功能;
      提交 commit: 事务开始后的处理结果反映到数据库中的操作;
      回滚 rollback:不反映到数据库而是恢复到原来状态的操作。
      创建表 bank 及添加几条记录:
      create table bank ( id varchar(20), name varchar(10), bank_id varchar(20), deposit int);
      insert into bank ( id, name, bank_id, deposit) values ( "510112200510216168", "张军", "6216613100018220000", 10000 );
      insert into bank ( id, name, bank_id, deposit) values ( "510112200512255320", "李兵", "6216613100018220001", 20000 );
      insert into bank ( id, name, bank_id, deposit) values ( "51011220051106280X", "王梅", "6216613100018220002", 20000 );
      
      mysql> select * from bank;
      +--------------------+------+---------------------+---------+
      | id                 | name | bank_id             | deposit |
      +--------------------+------+---------------------+---------+
      | 510112200510216168 | 张军 | 6216613100018220000 |   10000 |
      | 510112200512255320 | 李兵 | 6216613100018220001 |   20000 |
      | 51011220051106280X | 王梅 | 6216613100018220002 |   20000 |
      +--------------------+------+---------------------+---------+
      3 rows in set (0.500 sec)
      
      mysql>
                                                     

    • 提出问题:李兵向王梅转账 10000 , 但在最终提交到数据库时,发现王梅有电信诈骗的嫌疑,转账按原路退回给李兵,数据库如果实现这个过程?
      下面的命令给出了实现:
      
          start transaction;
          update bank set deposit=10000 where id="510112200512255320";
          update bank set deposit=30000 where id="51011220051106280X";
          rollback;
                                                     
      • start transaction : 开始事务。
      • rollback : 回滚。 执行回滚后,事务被关闭,下次使用事务时,需要开启事务:start transaction 。
      • 执行 rollback 后, 数据库记录会回滚到 start transaction 之前的状态。
      下面展示了开启事务后,更新记录,然后回滚,数据库记录的变化:
      mysql> start transaction;
      Query OK, 0 rows affected (0.006 sec)
      
      mysql> update bank set deposit=10000 where id="510112200512255320";
      Query OK, 1 row affected (0.007 sec)
      Rows matched: 1  Changed: 1  Warnings: 0
      
      mysql>     update bank set deposit=30000 where id="51011220051106280X";
      Query OK, 1 row affected (0.006 sec)
      Rows matched: 1  Changed: 1  Warnings: 0
      
      mysql> select * from bank;
      +--------------------+------+---------------------+---------+
      | id                 | name | bank_id             | deposit |
      +--------------------+------+---------------------+---------+
      | 510112200510216168 | 张军 | 6216613100018220000 |   10000 |
      | 510112200512255320 | 李兵 | 6216613100018220001 |   10000 |
      | 51011220051106280X | 王梅 | 6216613100018220002 |   30000 |
      +--------------------+------+---------------------+---------+
      3 rows in set (0.006 sec)
      
      mysql> rollback;
      Query OK, 0 rows affected (0.264 sec)
      
      mysql> select * from bank;
      +--------------------+------+---------------------+---------+
      | id                 | name | bank_id             | deposit |
      +--------------------+------+---------------------+---------+
      | 510112200510216168 | 张军 | 6216613100018220000 |   10000 |
      | 510112200512255320 | 李兵 | 6216613100018220001 |   20000 |
      | 51011220051106280X | 王梅 | 6216613100018220002 |   20000 |
      +--------------------+------+---------------------+---------+
      3 rows in set (0.005 sec)
      
      mysql>
                                                     
      • 上例中,如果用 commit 代替 rollback, 更新的记录会提交到数据库。
  2. 自动提交功能

    • 显示自动提交功能:
      
           select @@autocommit;
                                      
      
        mysql>  select @@autocommit;
      +--------------+
      | @@autocommit |
      +--------------+
      |            1 |
      +--------------+
      1 row in set (0.009 sec)
      
      mysql>
                                                     
      • autocommit 的值是 1 表示自动提交是开启的; autocommit 的值是 0 表示自动提交是关闭的。
      • Mysql 在默认状态下,自动提交功能是处于开启状态。关闭自动提交功能用: set autocommit=0;