事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
一、事务概述
1.1、什么是事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
事务是一个事件处理的完整的过程。比如:存款、取款、转帐等操作都可以称之为一个事务。
1.2、事务的应用场景
我们想完成一次转帐业务,那么他会多次去访问我们的数据库。转帐实上就是从一个帐户上扣钱,在往一个帐户上加钱。这样我们执行了二次sql,如果其中一个sql失败,那么整个业务就没有执行成功。所有的sql都需要回滚,整个业务失败。
数据准备
#创建数据表
create table yh(
id int primary key auto_increment,
name varchar(20),
money double
);
-- 添加数据
insert into yh(name,money)values('张三', 1000),('李四', 1000);
案例:
模拟张三给李四转500元钱
分析:
先从张三的帐户减出500,在往李四的帐户加入500元
mysql> update yh set money=money-500 where name='张三';
Query OK, 1 rows affected (0.02 秒)
mysql> update yh set money=money+500 where name='李四';
Query OK, 1 rows affected (0.04 秒)
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 500 |
| 2 | 李四 | 1500 |
+----+--------+-------+
2 行于数据集 (0.04 秒)
如果转帐时出现问题:
当张三账号上-500 元,服务器崩溃了。李四的账号并没有+500 元,数据就出现问题了。
因为他们是一个整体的业务,所以我们需要保证其中一条 SQL 语句出现问题,整个转账就算失败。只有两条 SQL 都成功了转账才算成功。这个时候就需要用到事务。
1.3、事务提交方式
mysql中有两种事务提交方式:
手动提交
自动提交
二、事务手动提交
2.1、手动提交的过程
事务执行成功的过程:开启事务->执行多条件SQL语句->成功->事务提交
事务执行失败的过程:开启事务->执行多条件SQL语句->失败->事务回滚
2.2、语法格式
格式:
start transaction; #开启事务
commit; #提交事务
rollback; #回滚事务
案例:
事务的成功提交:模拟张三给李四转 500 元钱(成功) 目前数据库数据如下:
#开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.01 秒)
#执行从张三帐户扣出500元
mysql> update yh set money=money-500 where name='张三';
Query OK, 1 rows affected (0.01 秒)
#执行往李四帐户加入500元
mysql> update yh set money=money+500 where name='李四';
Query OK, 1 rows affected (0.01 秒)
#提交事务
mysql> commit;
Query OK, 0 rows affected (0.08 秒)
#查看帐户
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 行于数据集 (0.01 秒)
事务回滚:模拟李四给张三转 500 元钱(失败) 目前数据库数据如下:
#开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.02 秒)
#执行从李四帐户扣出500元
mysql> update yh set money=money-500 where name='李四';
Query OK, 1 rows affected (0.01 秒)
#执行往张三帐户加入500元,但是加了600
mysql> update yh set money=money+600 where name='张三';
Query OK, 1 rows affected (0.01 秒)
#事务回滚
mysql> rollback;
Query OK, 0 rows affected (0.02 秒)
#查看帐户
mysql> select * from yh;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 0 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 行于数据集 (0.01 秒)
三、事务自动提交
MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL 默认开始自动提交事务。
如:
事务开始->update/delete/insert into->事务提交
3.1、自动提交事务
案例:
自动事务提交:往张三的帐户里存入1000元,目前数据库数据如下:
<