准备测试用例
mysql> drop table if exists accout;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create table accout(
-> id int primary key auto_increment,
-> name varchar(20) comment '账户名称',
-> money decimal(11,2) comment '金额'
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> insert into accout(name, money) values
-> ('小白', 5000),
-> ('小黑', 1000);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
比如说,小白打两千块钱到小黑的账户上去,对应的操作应该是小白账户上金额少2000,小黑账户上金额多2000。
-- 小白账户减少2000
update accout set money=money-2000 where name = '小白';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '小黑'
假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,小白的账户会减少2000,但是 小黑的账户上就没有了增加的金额。
解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。
但是计算机底层并不可能是真的不执行,只能是执行了,执行了一半发现了错误,恢复现场,把数据还原成未执行之前的状态。
这种机制叫做“回滚”
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
示例:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> update accout set money = money-2000 where name = "小白";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
**mysql> update accout set money = money+2000 where name = "小黑";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
我们可以这样理解隔离
一个餐馆(服务器),同一时刻要给多个顾客(客户端)提供服务这些顾客提出的请求是可能是一个接一个来的,也可能是一股脑一起来了一波。
此时,服务器同时处理多个客户端的请求,就称为“并发”(齐头并进的感觉)
数据库也是服务器,就有可能多个客户端都给服务器提交事务,数据库就需要并发的处理多个事务。
如果并发的这些事务,是修改不同的表/不同的数据,基本不会出现问题,但是如果修改的是同一个表/同一个数据, 可能会带来一定的问题的,比如多个客户端一起尝试对同一个账户进行转账操作,此时就可能会把。这个数据打乱了。
事务的隔离性存在的意义就是为了 在数据库并发处理事务的时候不会有问题(即使有问题, 问题也不大)。那么并发事务究竟会产生什么问题呢?
针对上述的问题,MySQL提供四个隔离级别应对上述情况
至此MySQL的事务就简单介绍到这里