根据尚硅谷的视频教程学习MySQL,学习记录-12-TCL语言
TCL:Transaction Conrtol Language 事务控制语言
事务
一个或一组SQL语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。
如果事务中某条SQL语句执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事务开始以前的状态;
举例:张三:1000元,李四:1000元,现:张三向赵四转账500元
update 账户表 set 张三的余额 = 500 where 账户名 = \'张三\'update 账户表 set 李四的余额 = 1500 where 账户名 = \'李四\'
MySQL中的存储引擎
SHOW ENGINES;
mysql中有多种存储引擎,但并不是所有存储引擎都支持事务,比如:innoDB支持,而myisam, memory等不支持事务
事务的属性 – ACID
- 原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 - 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(举例:A转账给B,两者的总金额在转账前和转账后是不变的) - 隔离性(Isolation)
一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰。 - 持久性(Durability)
事务一旦提交,对数据库中数据的改变是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
事务的创建
隐式事务:事务没有明显的开启和结束的标记,比如 insert、update、delete语句
显式事务:事务有明显的开启和结束的标记,前提必须先设置自动提交功能为禁用
set autocommit = 0
步骤一:开启事务
set autocommit = 0;start transaction; 可选的
步骤二:编写事务中的SQL语句(select insert update delete)
步骤三:结束事务
commit; #提交事务rollback; #回滚事务savepoint 节点; #回滚点
演示:
事务开始前表数据:
01 开启事务
set autocommit = 0;START TRANSACTION;
02 编写一组事务的语句 – 张三给李四转账500元
update account set balance = 500 where unsername = \'张三\';update account set balance =1500 where unsername = \'李四\';
03 结束事务
commit; #结束事务
执行结束事务的语句,结果为:
04 回滚
在上述结果的基础上调整事务的语句:update account set balance = 1000 where username = \'张三\';update account set balance =1000 where username = \'李四\';结束行为调整为:rollback;#回滚
此时结果: 以上语句对于数据并没有最终提交。
05 设置回滚点
SET AUTOCOMMIT = 0;start transaction;delete from account where userid = 1;savepoint a; #设置为回滚点delete from account where userid =6;rollback to a; #回滚到保存节点,那么savepoint后的语句不执行。
此时执行以上事务结果为:对应ID为6的数据没有被删除
数据库隔离级别
多个事务同时运行存在的问题:脏读、不可重复读、幻读
查看当前的隔离级别:
SELECT @@tx_isolation;
read uncommitted: 脏读:√,幻读:√,不可重复读:√
read committed:脏读: ×,幻读:√,不可重复读:√
repeatable read:脏读:×,幻读:√,不可重复读:×
serializable:脏读:×,幻读:×,不可重复度:×
mysql中默认为第三个隔离级别:repeatable read
oracle中默认为第二个隔离级别:read committed
设置隔离级别:
set session | global transaction isolation level 隔离级别;