MySQL-TCL语言-transaction control language事务控制语言

事务基础

概述

概念
事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由有限的数据库操作序列构成。
事务 = 一个或一组sql语句组成一个执行单元;这个执行单元要么全部执行,要么全部不执行。
每一个mysql语句是相互依赖的。

两个关键点
第一个,它是数据库最小的工作单元,是不可以再分的;
第二个,它可能包含了一个或者一系列的 DML 语句(database manipulation language),包括 insert delete update。 (单条 DDL(database define language)和 DQL(database query language)也会有事务)

使用事务原因
当一个业务流程涉及多个表的操作的时候,我们希望它们要么是全部成功的,要么都不成功,这时会启用事务。

案例

# 要求张三丰给郭襄转账500
表
张三丰    1000
郭襄       1000

updateset  张三丰的余额=500  where name = ‘张三丰’;
updateset  郭襄的余额=1500 where name = ‘郭襄’;

当出现语句1执行成功,但是由于某些原因,语句2没有得到执行。这样就会导致一个问题,张三丰的钱少了,但是并没有将其转给郭襄。

存储引擎

概念
在mysql中的数据用各种不同的技术存储在文件(或内存)中,又称存储引擎称为表类型。

存储引擎查看

show engines;
# 查看mysql支持的存储引擎。

常见存储引擎
Innodb、myisam、memory等。
其中innodb支持事务,而myisam、memory等不支持事务。
故innodb是默认存储引擎。

事务的ACID属性

  • 原子性(atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    实现:
    可以用 undo log 回滚日志来保证,回滚日志会记录当前事务的反向操作;
    当事务执行过程中出现异常时,就会触发回滚,执行 undo log 日志的回滚操作,将数据恢复到事务开始执行前的状态。

  • 一致性(consistency)
    事务必须使数据库从一个一致性状态变换到另一个一致性状态。
    实现:
    原子性和隔离性保证了数据库的一致性。

  • 隔离性(isolation)
    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
    实现:
    如果没有了隔离性,就可能会造成脏读、不可重复读和幻读的问题。所以事务与事务之间需要存在一定的隔离性,可以通过各种锁来实现。
    其次,事务有四个隔离级别,分别是:读未提交、读提交(Oracle 默认)、可重复读(MySQL 默认)和串行化。

  • 持久性(durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永远性的,接下来的其他操作和数据库故障不应该对其有任何影响。
    实现:
    由 redo log (重做日志)以及 WAL(Write-Ahead Logging:先写日志再写磁盘) 技术来实现的。
    当有一个更新数据的事务提交之后;InnoDB 存储引擎会先把更新的操作写到 redo log 日志里,并同时将数据更新到内存中(这里就是更新完成了),之后就是等待 InnoDB 将数据持久化到磁盘了。而如果在这等待的过程中,数据库发生异常重启了,也就是数据还没有被持久化到磁盘, 那这个时候就可以根据 redo log 将数据重新恢复到内存中,直到被持久化到磁盘中。

事务创建

事务的分类

隐式(自动)事务

  • 含义
    事务没有明显的开启和结束的标记,比如insert、update、delete语句 。

  • 案例

delete fromwhere id = 1 ;
  • 启动方式查询
show variables like ‘autocommit’;

显式事务

  • 含义
    事务具有明显的开启和结束的标记

  • 前提
    必须先设置自动提交功能为禁用。

  • 关闭事务自动提交功能

set autocommit = 0
  • 关闭事务指着对当前的事务有效。

显式事务具体操作步骤

①开启事务
set autocommit = 0;
start transaction; # 可以省略

② 编写事务中的逻辑sql语句(select insert update delete)
语句1;
语句2......
设置回滚点:savepoint 回滚点名;

③ 结束事务
commit; 提交事务
rollback; 回滚事务
rollback to 回滚点名; 回滚到指定的地方;

案例
在这里插入图片描述

事务的并发问题

事务的并发问题 = 多个事务 同时 操作 同一个数据库的相同数据。

同时运行多个事务,当它们访问数据库中相同的数据时,如果没有采取必要的隔离机制,则会导致各种并发问题。

问题介绍如下:

  • 脏读:
    两个事务T1和T2,T2更新但还没有提交的字段,T1读取了。若此时T2回滚,则T1读取到的就是临时且无效的。
    (一个事务读取了其他事务没有提交的数据,读到的是其他事务“更新”的数据)
  • 不可重复读:
    两个事务T1和T2,T1读取字段内容,之后T2更新了字段内容,T1再读取同一个字段,此时值不同。
    (一个事务多次读取,结果不一样)
  • 幻读:
    两个事务T1和T2,T1从一个表中读取一个字段,然后T2在该表中插入了新的行,之后T1再读同一个表,就会多出几行。
    (一个事务读取了其他事务没有提交的数据,只是读到的是其他事务“插入”的数据)

数据库事务的隔离性

概述
  • 数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。

  • 一个事务与其他事务隔离的程度称为隔离级别。
    数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性约弱。

  • 事务的隔离级别
    oracle
    两种:read committed(默认)、serlalizable
    mysql
    四种:read uncommitted、read committed、repeatable read、serializable

隔离级别描述脏读不可重复读幻读
read uncommitted
读未提交数据
允许事务读取未被其他事务提交的变更。
脏读、不可重复读和幻读问题都会出现。
read committed
读已提交数据
只允许事务读取已经被其他事务提交的变更。
不可重复读 和 幻读问题会出现
repeatable read
可重复读数据
确保事务可以多次从一个字段中读取相同的值,在此事务执行期间,禁止其他事务对这个字段进行更新。
幻读问题会出现
serializable
串行化
确保事务可以从一个表中读取相同的行,在事务持续期间,禁止其他事务对该表执行插入、更新和删除的操作。
无问题存在
事务隔离级别演示
  • 连接数据库
    在这里插入图片描述
  • 查看当前的默认隔离级别
每启动一个mysql程序,就会获取一个单独的数据库链接;
每个数据库链接都有一个全局变量@@tx_isolation,标识当前的事务隔离级别。
查看当前的隔离级别:select @@tx_isolation;

在这里插入图片描述

  • 设置当前mysql连接的隔离级别
set [session] transaction isolation level 隔离级别;

在这里插入图片描述

  • 设置数据库系统的全局隔离级别
set global transaction isolation level 隔离级别;

事务的状态

状态名说明
活动状态事务对应的数据库操作正在执行
局部提交状态事务的最后一个语句执行之后,但是还未写到磁盘中
失败状态当事务处于活动或部分提交,出错无法继续执行,或人为停止当前事务提交
中止状态回滚后的状态
提交状态部分提交状态的事务将修改的数据写到磁盘之后。

中止 和 提交状态 才是事务最终的状态。

回滚点

语法

savepoint 节点名;
# 设置保存点,就是一个标识符位置
# 需要搭配 
rollback to 节点名;

案例
在这里插入图片描述
在这里插入图片描述

delete 和 truncate 事务 区别

区别deletetruncate
说明使用delete删除表格,再使用rollback回滚
此时表格并没有被删除
使用truncate删除表格,再使用rollback回滚
此时表格被删除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值