137 MySQL事务
一、事务的概念
-
事务:通常就是一些业务需要多条sql语句参与,参与的sql语句会形成一个执行的整体,该整体我们称之为是一个事物
-
简而言之:事务就是保护多条执行的sql语句,必须同时执行成功
案例:转账就是一个事务 从一个用户将资金转出,再将资金转入到另一个用户 这两条执行语句都必须要同时执行成功,或者同时不成功 不能我已经从我的的账户转给对方钱,我的钱少了但是对方没有收到
二、事物的四大特性
- 原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功
- 一致性:事物前后的数据完整性应该保持一致(数据库的完整性:如果数据库在某一时间点下,所有的数据都符合所有的约束,则称数据库为完整性的状态)
- 隔离性:事物的隔离性是指多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
- 持久性:持久性是指一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
三、事务案例
我们这里就以银行的案列为例
1.先创建银行表,然后插入两个用户
create table bank(
id int,
name varchar(16),
money decimal(65, 2)
);
insert into bank values(1, 'Tom', 10), (2, "Bob", 10);
3.1 错误案例(未使用事务)
1.进行转账操作(没有事务的支持下)
# 先将Tom的钱减去,然后再给ruakei的用户加钱,但问题来了
# 我们的表里面并没有ruakey这个用户啊,所以给ruakey加钱的这个sql语句实际上是没有意义的
# 所以这样就会导致Tom用户的钱就丢了,所以吴国一个银行出现了这种情况的话,后果不堪设想
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei';
mysql> select * from bank;
+------+------+-------+
| id | name | money |
+------+------+-------+
| 1 | Tom | 9.00 |
| 2 | Bob | 10.00 |
+------+------+-------+
3.2 开启事务
开启事务的方式
begin;
sql语句;
sql语句;
commit; 当确认上面两条sql语句都正确执行了,同时成功了,提交事务,数据表里的数据会进行对应的修改
- rollback的情况
# 将两条sql看做事务处理
# 开启事务
begin;
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei';
select * from bank;(这个时候,发现表里的数据tom被减钱了,没有ruakey这个账户,所以以上两条sql语句是错误的所以,执行rollback语句还原tom用户减钱之前)
# 确认有误,回滚
rollback;
##################################cmd 图解
mysql> select * from bank;
+------+------+-------+
| id | name | money |
+------+------+-------+
| 1 | Tom | 9.00 |
| 2 | Bob | 10.00 |
+------+------+-------+
mysql> rollback;
Query OK, 0 rows affected (0.14 sec)
mysql> select * from bank;
+------+------+-------+
| id | name | money |
+------+------+-------+
| 1 | Tom | 10.00 |
| 2 | Bob | 10.00 |
+------+------+-------+
- commit的情况
begin;
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='Bob';
select * from bank;(这个时候,发现表里的数据tom被减钱了,bob账户也加钱了,所以我们提交事务)
# 确认无误,提交事务
commit;
######################################cmd 图解
mysql> select * from bank;
+------+------+-------+
| id | name | money |
+------+------+-------+
| 1 | Tom | 9.00 |
| 2 | Bob | 11.00 |
+------+------+-------+