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 status\G;   查看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表发现记录已经修改
posted @ 2018-01-02 14:33  瓷铜  阅读(206)  评论(0编辑  收藏  举报