欢迎来到Cecilia陈的博客

孤独,是人一生最好的修行。

137 MySQL事务

一、事务的概念

  • 事务:通常就是一些业务需要多条sql语句参与,参与的sql语句会形成一个执行的整体,该整体我们称之为是一个事物

  • 简而言之:事务就是保护多条执行的sql语句,必须同时执行成功

    案例:转账就是一个事务
    从一个用户将资金转出,再将资金转入到另一个用户
    这两条执行语句都必须要同时执行成功,或者同时不成功
    不能我已经从我的的账户转给对方钱,我的钱少了但是对方没有收到
    

二、事物的四大特性

  1. 原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功
  2. 一致性:事物前后的数据完整性应该保持一致(数据库的完整性:如果数据库在某一时间点下,所有的数据都符合所有的约束,则称数据库为完整性的状态)
  3. 隔离性:事物的隔离性是指多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
  4. 持久性:持久性是指一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

三、事务案例

我们这里就以银行的案列为例

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 |
+------+------+-------+
posted @ 2019-10-04 14:52  Cecilia陈  阅读(161)  评论(0编辑  收藏  举报