Mysql事务。开启事务、脏读、不可重复读、幻读、隔离级别

Mysql事务。开启事务、脏读、不可重复读、幻读、隔离级别,第1张

Mysql事务。开启事务、脏读、不可重复读、幻读、隔离级别

目录标题
  • 概念
  • 开启一个事务
  • 事务的并发问题

概念

事务:一组sql语句 要么同时成功 要么同时失败

MyISAM存储引擎不支持事务 InnoDB存储引擎支持事务

事务的acid原则

  • 原子性 atomicity :原子性是指事务是一个不可分割的工作单位,事务中的 *** 作要么都发生,要么都不发生。
  • 一致性 consistency :事务必须使数据库从一个一致性状态变换到另外一-个一致性状态
  • 隔离性 isolation :一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰。
  • 持久性 durability :事务一旦提交就是永久性的修改

事务的分类:隐式事务、显式事务


开启一个事务

第一步,开启事务

set autocommit=0;
start transaction;

第二步,执行多条sql

第三步,提交事务或回滚

-- 提交
commit;

-- 回滚
rollback;

事务的并发问题

当多个事务访问相同的数据,如果没有相应的隔离级别就会导致各种并发问题:

  • 脏读:读取到了别人进行修改但还未提交的数据
  • 不可重复读:在一次事务中,两次查询同一条数据,得到的结果不一样
  • 幻读:在一次事务中,先查询一次数据表,然后其他人进行了一次新增,然后又查询一次 两次查询的结果不一样,与脏读的区别是幻读的侧重点在新增,而脏读的侧重点在修改。

上面这几种问题都可以通过设置事务的隔离级别,

Oracle只支持read commit和serializable两种隔离级别
而mysql支持四种

隔离级别描述read uncommitted 读未提交允许事务读取未被其他事务提交的变更,
产生的问题:脏读、不可重复读、幻读read committed :读已提交
(oracle数据库默认)只允许事务读取其他事务提交了的变更
产生的问题:不可重复读、幻读repeatable read :可重复读
(MysQL默认)在当前事务持续期间,禁止其他事务对这个字段进行更新,确保多次读取的值相同。
产生的问题:幻读serializable :串行化在当前事务持续期间,禁止其他事务对数据表进行增删改 *** 作,所有问题都可以避免,性能低

数据库查询隔离级别︰
select @@tx_isolation;

数据库设置隔离级别∶
set global transaction isolation level 级别字符串;

第二个单词global表示设置全局隔离级别 也可以该为session表示设置当前连接的隔离级别

回滚点

-- 设置回滚点
savepoint 自定义一个名字;

-- 回滚到某个回滚点
rollback to  自定义名字;

上面这两行语句一般都是搭配在一起使用的,一般都是在同一个事务中。例如:

set autocommit=0;
start transaction;
-- 第一条删除语句
delete from 表名 where 筛选条件;
-- 设置回滚点
savepoint aaa;
-- 第二条删除语句
delete from 表名 where 筛选条件;
-- 回滚到上面aaa回滚点
rollback to  aaa;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5438291.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存