首页 > 数据库 >Mysql事务控制

Mysql事务控制

时间:2022-08-19 21:35:55浏览次数:93  
标签:控制 事务 修改 read 并发 Mysql table select

事务Transaction

  • 并发控制的基本操作
  • 可以看成一系列的SQL语句
  • 要么成功,要么失败,失败回滚

事务特性ACID

  • 原子性Atomicity:事务内的操作要么全部成功,要么全部失败
  • 一致性Consistency:事务开始和结束后,数据完整性没有被破坏
  • 隔离性Isolation:多个事务同时对数据库进行操作,互不影响
  • 持久性Durability:事务结束后,修改是永久的,不会丢失

其实事务主要是为了实现 C ,也就是一致性,具体是通过AID,即原子性、隔离性和持久性来达到一致性的目的,所以这四个不应该相提并论,但是他们就想拼成单词,就把它们排好序搞在一起来念。

MVCC(Mutil-Version Concurrency Control)

多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。

应用特点是读多写少,读锁和读锁之间不互斥提高并发,写锁和写锁、读锁都互斥
想要提高并发,寻求读锁和写锁不冲突的方法:undolog版本链
这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中拿记录,这就实现了写-读的并发执行
参考:[https://baijiahao.baidu.com/s?id=1629409989970483292&wfr=spider&for=pc]
[https://zhuanlan.zhihu.com/p/66791480]

不对事务进行并发控制

  • 幻读(phantom read): 同一事务内 第二次查出第一次没有的结果(其他事务进行插入操作并且提交了)

    • 解决幻读

      MVCC加上间隙锁的方式
      (1)在快照读读情况下,mysql通过mvcc来避免幻读。
      (2)在当前读读情况下,mysql通过next-key来避免幻读。锁住某个条件下的数据不能更改。

      快照读:简单的select操作,属于快照读,不加锁。(当然,也有例外,下面的select)
      当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
      
      select * from table where ? lock in share mode;
      select * from table where ? for update;
      insert into table values (…);
      update table set ? where ?;
      delete from table where ?;
      
  • 非重复读(nonrepeatable read):一个事务重复读两次得到不同结果

    • 采用行锁和可重复读的事务隔离级别可以解决
  • 脏读(dirty read):一个事务读取到另一个事务没有提交的修改

  • 修改丢失(lost update):并发写入造成修改丢失

解决并发控制异常:四种事务级别

  • 读未提交(read uncommited)
  • 读已提交(read commited)
  • 可重复读(repeatable read):同一个事务先后查询结果一样 (Innodb引擎默认级别)
  • 串行化(serializable)

高并发下的插入重复

  • 数据库层面:唯一索引
  • 使用队列异步写入
  • redis实现分布式锁:插入持有锁,插入完成释放锁

乐观锁和悲观锁

  • 悲观锁:先获取锁再操作(select for update)
  • 乐观锁:假设没有修改,定义一个版本号(时间戳),修改时发现版本号(时间戳)改变,就得回滚了(check and set)

根据响应速度,冲突频率,重试代价来选择锁类型

标签:控制,事务,修改,read,并发,Mysql,table,select
From: https://www.cnblogs.com/aleiyoy/p/16603342.html

相关文章

  • Canal 过滤/同步 DDL 语句到 MySQL 从库
    canal.deploy配置vimcanal.propertiescanal.serverMode=tcpvimexample/instance.properties#只同步FlinkEtl数据库的数据#tableregexcanal.instance.f......
  • 基于StatefulSet控制器运行MySQL一主多从
      基于StatefulSet的mysql主从架构  下载xtrabackup镜像root@deploy:/dockerfile/project/mysql/pv#dockerpullregistry.cn-hangzhou.aliyuncs.com/liangxiaohu......
  • 逻辑控制语句和循环控制语句
    逻辑控制语句if语句if(条件表达式){语句体;}意思:如果....条件表达式返回的结果如果为true,则执行语句体,如果为false则跳过当前if条件判断 if(条件表达......
  • tkMapper事务隔离级别_事务的传播机制
    事务的传播机制@Transactional(propagation=Propagation.SUPPORTS)一般来讲,查询操作SUPPORTS带有增删改操作的,REQUIRED,表示是需要事务的隔离级别,可以使用......
  • 【2022-08-19】mysql基础知识(六)
    mysql基础知识(六)mysql之视图view什么是视图?视图就是通过查询得到的一张虚拟表,然后保存下来,下次直接进行使用即可。即:将SQL语句的查询结果当做虚拟表保存起来,以后可......
  • 基于StatefulSet控制器运行Redis Cluster
    redis集群规划  redis0——>master  redis1——>master  redis2——>master  redis3——>slave  redis4——>slave  redis5——>slave 构建镜像  ......
  • mysql MVCC中高水位先的trx_id
    读《mysql45讲》之后的总结 InnoDB为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务ID。“活跃”指的就是,启动了但还没提交数组里面事......
  • mysql
    1.表结构InnoDB和MyISAM的区别这两个在数据目录下对应的数据库子目录会创建一个专门用于描绘表结构的文件,以 表名.frm 为结尾的文件。InnoDB还会创建 表名.ibd文件 存......
  • MySQL日志详解
    一、mysql日志日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、二进制日志、查询日志、慢查询日志、事务日志(redolog......
  • 【三大锁】悲观锁——mysql悲观锁
    一三大常用锁悲观锁你准备去银行取10w了,跟银行提前打个招呼,有个10w现金谁都别动。(一般只限制写-别人不能取那10w但是能查到银行总体余额,某些场景会限制读)乐观......