AI智能
改变未来

MySQL学习记录 – 12-TCL(事务控制语言)

根据尚硅谷的视频教程学习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

  1. 原子性(Atomicity)
    事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  2. 一致性(Consistency)
    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(举例:A转账给B,两者的总金额在转账前和转账后是不变的)
  3. 隔离性(Isolation)
    一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰。
  4. 持久性(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 隔离级别;
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » MySQL学习记录 – 12-TCL(事务控制语言)