一、介绍
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表发现记录已经修改