137 MySQL事务

1、事务的概念

  • 事务:一般就是一些业务须要多条sql语句参与,参与的sql语句会造成一个执行的总体,该总体咱们称之为是一个事物sql

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

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

2、事物的四大特性

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

3、事务案例

咱们这里就以银行的案列为例并发

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 开启事务

开启事务的方式code

begin;事务

sql语句;ci

sql语句;cmd

commit; 当确认上面两条sql语句都正确执行了,同时成功了,提交事务,数据表里的数据会进行对应的修改it

  • 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 |
+------+------+-------+
相关文章
相关标签/搜索