• Mysql之事务


    一、介绍

    Mysql事务主要用于处理操作量大,提要度高的数据。比如,在银行支付系统中,A转帐给B三千元,B需要增加三千元,A也需要减少三千元等等操作,这样,这些数据库操作语句就构成了一个事务。
    在Mysql中只有使用Innodb数据训引擎的数据库或表才支持事务。
    事务处理可以用来维护数据库的数据一致性和完整性,保证一组SQL语句要么全部可以执行,要么不能全部执行。
    事务用来管理insert,update,delete语句

    二、使用方法 

    1.事务控制语句

    Begin或start transaction;开启一个事务 
    commit;提交事务并写入到磁盘中
    rollback;回滚会结束用户的事务,并撤消正在进行的所有未提交的修改
    

    2.Mysql事务处理主要有两种方法

    #1.用Begin、rollback、commit来实现
    Begin 开启一个事务 
    rollback事务回滚
    commit 事务确认
    #2.直接用set 来改变Mysql的自动提交模式 
    set autocommit=0 禁止自动提交 
    set autocommit=1 开启自动提交 
    

      

    三、案例 

    1.事务流程操作

    [root@ping ~]# ifconfig       #查看是否连接的是数据库服务器
    eth0      Link encap:Ethernet  HWaddr 52:54:00:A0:63:E1
              inet addr:192.168.100.2  Bcast:192.168.100.255  Mask:255.255.255.0
              inet6 addr: fe80::5054:ff:fea0:63e1/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:7650 errors:0 dropped:0 overruns:0 frame:0
              TX packets:3077 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:628470 (613.7 KiB)  TX bytes:351919 (343.6 KiB)
    
    [root@ping ~]# tty            #显示当前终端连接标准输入设备的文件名称                                        
    /dev/pts/0
      
    mysql> create database balk;   #创建数据库balk
    Query OK, 1 row affected (0.00 sec)
    
    mysql> create table user( id int unsigned not null auto_increment primary key,
         -> name varchar(10),
         -> money int)  engine=innodb;
    Query OK, 0 rows affected (0.01 sec)   #创建user表,并指定存储引擎innodb
    
    mysql> show table statusG;   查看user表存储引擎是否是innodb
    *************************** 1. row ***************************
               Name: user
             Engine: InnoDB
            Version: 10
         Row_format: Compact
               Rows: 0
     Avg_row_length: 0
        Data_length: 16384
    Max_data_length: 0
       Index_length: 0
          Data_free: 4194304
     Auto_increment: 1
        Create_time: 2018-01-02 14:59:09
        Update_time: NULL
         Check_time: NULL
          Collation: latin1_swedish_ci
           Checksum: NULL
     Create_options:
            Comment:
    1 row in set (0.00 sec)
    
    mysql> desc user;        #查看表结构
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(10)      | YES  |     | NULL    |                |
    | momey | int(11)          | YES  |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    
    mysql> insert into user(name,momey) values('ping',3000),('jack',1500); #插入字段name,momey记录
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> start transaction;    #开启一个事务
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from user;   #查看开启事务的表记录
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | ping |  3000 |
    |  2 | jack |  1500 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    
    mysql> update user set money=2500 where name='jack';  #给jack转帐2500
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> update user set money=500 where name='ping';        #去除ping帐户2000
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    ping@ping:~/Desktop$ ssh root@192.168.100.2       #再打开一个终端
    root@192.168.100.2's password: 
    Last login: Tue Jan  2 14:55:02 2018 from 192.168.100.1
    [root@ping ~]# 
    
    [root@ping ~]# mysql -uroot -p123456
    #连接mysql
    
    mysql> select * from balk.user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | ping |  3000 |
    |  2 | jack |  1500 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    #查看user表的记录发现数据并没有修改,由于在事务中数据修改是在内在中,只有commit了,数据才会写入到磁盘中
    
    mysql> commit; 
    Query OK, 0 rows affected (0.01 sec)
    #提交,当用户转账网络连接断开,修改的记录可以使用rooback事务回滚
    
    mysql> select * from balk.user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | ping |  1500 |
    |  2 | jack |  3000 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    #查看user表发现记录已经修改
  • 相关阅读:
    hadoop学习摘要
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
    sqlserver 2012 IDE中 Windows身份验证连接服务器报错 ,Login failed for user 'xxxAdministrator'. 原因: 找不到与提供的名称匹配的登录名。
    不重复随机数列生成算法
    异步和等待(async和await)
    mvc和mvvm的区别?
    Redis命令大全
    Java NIO 三大组件之 Buffer
    Java NIO 三大组件之 Channel
    Java NIO概述
  • 原文地址:https://www.cnblogs.com/pingzhe/p/8177089.html
Copyright © 2020-2023  润新知