首页 > 数据库 >mysql事务

mysql事务

时间:2022-08-21 00:22:42浏览次数:85  
标签:事务 隔离 数据 提交 mysql 共享 级别

1.事务是什么?

2.acid特性

3.隔离级别

4.实现:mvcc锁undolog redolog

5.并发异常 读异常 死锁

 

目的:事务讲数据库从一种一致性状态转换成另一种一致性状态。

组成:事务可以是简单的一条语句,可以是一组语句。

 

ACID特性

事务回滚操作依靠undolog来实现,每操作一句,undolog都会记录,回滚时,会做相反的动作。undolog存储在共享表里。

redolog:事务提交后,事务DML操作将会持久化(写入redolog磁盘文件 哪一个页 页 偏移值)即使发生宕机等故障,数据库也能将数据恢复。redolog记录的时物理日志。 

MVCC提供了一种快照读的方式提高并发性能。

mvcc 在sql后不加任何参数时快照读,

当前读:加lock in share mode是共享锁,加for update是排他锁,insert ,update,delete

myisam只支持表锁

 

隔离级别:

隔离级别越高并发性能越低,

 隔离级别由低到高:

read uncommitted:读未提交,该级别下都不加锁,写加排他锁,写锁在事务提交或回滚后释放锁;   容易产生读异常;

read committed:该级别支持MVCC(多版本并发控制),也就是提供一致性非锁定读。此时读取操作读取历史快照数据;该隔离级别下读取历史版本的最新数据,所以读取的是已提交的数据。

repeatable read:可重复读:此时读取操作读取事务开始时的版本数据;  mysql默认这个级别,自动添加排他X锁

serializable:可串行化,该级别下给读加了共享锁,所以事务都是串行化的执行,此时隔离级别最严苛。

 

 

 

select * from table lock in share mode;加读锁

select * from table for update;加写锁

 

排他锁:删除和更新时自动添加X锁,插入时,1.会先添加插入意向锁,insert intention lock,然后再把这个数据加上X锁,2.如果是自增,会添加auto-inc lock,自增锁

 

意向共享锁:对一张表中某几行加的共享锁

意向排他锁:对一张表中某几行加的排他锁

目的:为了告诉其他事务,此时这张表被一个事务在访问,作用:排除全表读写锁

 

 

如果是走的辅助索引,则只会给辅助索引加gap锁

 

 

事务开始前加锁持续锁,事务提交或者回滚的时候,释放锁

脏读:隔离级别为读未提交,一个事务读到另一个事务修改的数据(未提交),造成数据错乱。解决办法:提升隔离级别到读已提交

不可重复读:在隔离级别为读已提交或读未提交,同一个事务中,两次查询同一行的数据不一致。发生在两次查询之间有其他事务修改了这一行的数据。解决办法:提升隔离级别到可重复读

幻读:同一事务中,两次查询同一范围出来的结果集不一致。  解决办法:加共享锁,让写的事务阻塞

丢失更新:回滚覆盖,B事务修改一个数据后提交,此时A时候回滚会回滚到之前的版本。数据库拒绝不可能发生。

                 提交覆盖,两个事务同时操作一个数据,最后操作并提交的会覆盖前一个操作的数据。解决办法:加锁,共享锁或者写锁

共享锁(S锁)又称为读锁,若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

死锁的一个典型场景:事务A先申请数据行1的共享锁,然后申请数据行2的排他锁。事务B先申请数据行2的共享锁,后申请数据行1的排他锁。结果事务A和B申请完共享锁后,申请排他锁的请求都被对方block住了,导致死锁。

搜索

复制

标签:事务,隔离,数据,提交,mysql,共享,级别
From: https://www.cnblogs.com/cuijy1/p/16275178.html

相关文章

  • mysql 命令创建表格
    显示mysql相关显示命令:showdatabases;#显示数据库创建的数据库名use[databasename]#后showtables;查看table数据信息describe[tablename]#显示表格信息......
  • MySQL使用总结
    最近在做一个数据迁移的项目,把mysql数据库中的数据迁移到SqlServer数据库中。在这里记录一下最近遇到的一些问题。一、MySQL中没有top 在MySQL中没有top查询,但是可以使......
  • 根据MySQL表生成C#实体模型
    1USEINFORMATION_SCHEMA;2SELECT3CONCAT(4'///<summary>\r\n///',5COLUMN_COMMENT,6'\r\n///</summary>\r\n[DataMemb......
  • MySQL之事务和索引
    视图概念:就是有一张或者多张表组织成的结果形成的一张虚拟表,仅仅是为了更便捷的查看数据而产生的,无法使用sql语句做增删改的操作!(不推荐使用)语句结构:createview......
  • Navicat可视化软件、Navicat可视化软件、python操作MySQL、语法知识补充
    今日内容概要Navicat可视化软件多表查询练习题python操作MySQL知识补充今日内容详细Navicat可视化软件相关操作连接MySQL在官网上下载并安装好最新的Navicat软件......
  • 视图、触发器、存储过程、事务(掌握)、内置函数、流程控制、循环结构、索引与慢查询优
    视图SQL语句执行的结果是一张虚拟表,我们可以基于这张表做其他的操作,如果这张虚拟表需要频繁使用,为了方便可以将这张虚拟表保存起来,保存之后就称之为视图(view)。视图的本......
  • Mysql补全时间段内的日期
    Mysql补全时间段内的日期通过辅助表补全时间段的日期1、辅助表需要保证有足够多的数据,且比较稳定,数据确定了之后基本不会进行增删改操作最好;个人觉得200-300条数据就差......
  • win10 python mysqlclient 安装问题 已解决
    用习惯了Linux  忽然换到win10超级不习惯 今天下午就一个mysqlclient安装弄了好长时间 ,最后发现是得改名 真是想爆粗口。下面直接进入正题:下载地址  https:......
  • MySQL JSON函数文档搬运
    本文搬运了MySQL对JSON的支持相关的函数/*自MySQL5.7版本以后,加入了JSON字段类型支持,并提供一系列函数实测字段类型设置为varchar,只要字段值为合法json,MYSQLJSO......
  • 30. Redis---事务(24补充)
    1.前言Redis事务的目的是方便用户一次执行多个命令。执行Redis事务可分为三个阶段:开始事务命令入队执行事务2.Redis事务特性Redis事务具有两个重要特性:1)单......