MySQL操作系列之TCL事务控制语言(七)

(一).mysql中的事物是什么

1.sql中的事物是什么:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行;

2.经典案例:转账(事物就是为了解决这个问题而存在:事物回滚)
小明账户余额1000元,小红账户余额800元,现在小明要转账500到小红,那么要同时执行两个sql语句:
update 表 set 小明账户余额=500元 where name="小明";

update 表 set 小红账户余额=1300元 where name="小红";
如果这两条语句第一条执行成功后,出现了意外,第二条语句没有执行成功,结果就会变成小明账户余额为500元,小红账户余额为800元。

(二).存储引擎对事务的支持:

SHOW ENGINES;语句显示所有的存储引擎;
其中只有InnoDB支持事务,而MEMORY,MyISAM不支持事务,用得最多的是MEMORY,MyISAM,InnoDB;

(三).事务的特性(ACID)

①Atomicity原子性:一个事务不可再分割,要么都执行要么都不执行;
②Consistent一致性:一个事务执行会使数据从一个一致状态切换到另一个一致状态,也就是事物开始与完成时,数据都笔记保持一致性;
③Isolation隔离性:一个事务的执行不受其它事务的干扰;
④Durable持久性:一个事务的提交则会永久的改变数据库中的数据,即便系统出现故障也能够保持;

(四).事务的创建:

隐式事务(自动提交):如update,delete,insert语句;
显式事务:事务具有明显的开启和结束的标记;前提条件是必须先设置自动提交功能为禁用,执行set autocommit=0语句,
         此语句只作用一次,只作用当前会话,作用完之后,事务还是会自动开启;
创建步骤:
步骤1:开启事务
set autocommit=0;
start transaction;(可选的,可以执行)
步骤2:编写事务中的sql语句
语句1;语句2;语句3;....
步骤三:结束事务
commit;提交事务

rollback;回滚事务

(五).事务的并发问题(通过设置事务隔离级别去解决问题)

①更新丢失:就类似git上的版本覆盖,由于每个事物都不知道其它事物的存在,就会发生丢失更新问题,最后事物的更新覆盖了其它事物所做的更新。如果在一个事物修改这个数据之前,其余事物不能操作这个数据,就可以避免此问题。
②脏读:事物A读取到了事物B已修改单尚未提交的数据,还在这个数据基础上做了操作。此时如果B事物回滚,A读取的数据无效,不符合一致性要求。
③不可重复读:事物A读取到的事物B已经提交的修改的数据,不符合隔离性。
④幻读:事物A读取到的事物B已经提交的新增的数据,不符合隔离性。
查看事物的隔离级别:show variables like 'tx_isolation';

(六).回滚点的使用:最终下面执行(同时执行)的只有delete from 表名 where id=1语句生效;

set autocommit=0;//关闭自动提交
start transaction;
delete from 表名 where id=1;
savepoint a;//设置保存点
delete from 表名 where id=2;
rollback to a;//回滚到保存点

注:好了,支持mysql的上篇系列已ok,下篇系列为mysql的优化等高级特性部分

      下篇主要是从:mysql存储引擎,mysql索引优化,mysql主从复制等等

猜你喜欢

转载自blog.csdn.net/qq_33429583/article/details/86512140