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