MySQ事务

事务

事务是访问数据库的一个操作序列,事务的正确执行使得数据库从一种状态转换为另一种状态。事务必须服从ACID原则。原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。

  • 原子性:不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交完成,则所有的数据库操作被提交,数据库状态变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态变换。
  • 一致性:事务的执行使得数据库从一种正确状态转换为另外一种正确状态。
  • 隔离性:在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务。
  • 持久性:事务正确提交之后,其结果永远保存在数据库之中。
事务隔离级别

事务的四种隔离级别

  • READ_UNCOMMITED:读未提交,即能够读取到没有被提交的数据,存在脏读、不可重复读、幻读问题
  • READ_COMMITED:读已提交,即能够读到那些已经提交的数据,存在不可重复读、幻读问题
  • REPEATABLE_READ:可重复读,即在数据读出来之后加锁,即这条事务不结束,其他事务就不可以改这条记录,存在幻读问题
  • SERIALIZABLE:串行化,最高的隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才能执行下一个事务,解决所有问题。
数据库悲观锁乐观锁
  • 悲观锁主要是共享锁和排他锁
    ①共享锁又称为读锁,简称S锁,共享锁就是多个事务对于同一个数据可以共享一把锁,都能访问到数据,但是只能读不能修改(lock in share mode)
    ②排他锁又称为写锁,简称X锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务可以对数据进行读取和修改(for update)
  • 乐观锁一般是以下两种方式
    ①使用版本号,使用数据版本(Version)记录机制实现
    ②使用时间戳,与版本号机制类似
    小结:悲观锁比较是和写入操作比较频繁的场景,乐观锁比较适合读取操作比较频繁的场景
mysql存储引擎
-             MyISAM                 InnoDB
①索引类型:    非聚簇索引               聚簇索引
②支持事务:    否                      是      
③支持表锁:    是                      是
④支持行锁:    否                      是
⑤支持外键:    否                      是
⑥适合操作类型:大量select              大量insert、delete、update
- 表文件
①MyISAM:.frm表结构文件  .MYI表索引文件  .MYD表数据文件
②InnoDB: .frm表结构文件 .ibd表索引和表数据文件
③Memory:数据是保存在内存中,表结构是存在磁盘文件中,所以重启或宕机时,表中数据丢失,
表结构还在。特点:支持HASH索引(等值查询)和B+数索引(范围查找),默认是HASH;
所有字段do欧威固定长度varchar(10) = char(10);使用表级锁。
- 聚簇索引与非局促索引的区别
聚簇索引并不是一种索引类型,而是一种数据存储方式。聚簇索引是将数据存储与索引放到了一块,
找到索引也就找到了数据。非聚簇索引将数据存储与索引分开的结构,索引结构的叶子节点指向了
数据的对应行的物理地址。
mysql索引的分类

mysql索引的五种类型:主键索引、唯一索引、普通索引、全文索引、联合索引。通过添加索引可以提高数据的读取速速,提高项目的并发能力和抗压能力。
①主键索引:主键是一种唯一性索引,但它必须制定为PRIMARY KEY,每个表只能有一个主键
②唯一索引:索引列的所有值都只能出现一次,即必须唯一,值可以为空
③普通索引:基本的索引类型,值可以为空,没有唯一性的限制
④全文索引:全文索引的索引类型为FULLTEXT,全文索引可以在varchar、char、text类型的列上创建
⑤联合索引:多列值组成一个索引,专门用于联合索引
索引按照数据结构来分的话,主要是两种B+树和hash索引

  • 聚簇索引 B+树是左小右大的顺序存储结构,节点只包含id索引列,而叶子节点包含索引列和数据,这种数据和索引在一起存储的索引方式叫聚簇索引,一张表只有主键是聚簇索引。
  • 非聚簇索引 非聚簇索引(二级索引)保存的是主键id值
mysql回表、覆盖索引、最左匹配原则、谓词下推
- 回表:在InnoDB表中,通过普通索引找到主键值,再通过聚簇索引定位到具体的记录,这就是回表。(因为在InnoDB表中,索引使用B+树实现,那么普通索引的叶子节点存的是索引和主键值。)
- 覆盖索引:如果一个索引包含(或覆盖)所有需要查询的字段的值,成为"覆盖索引"。即只需扫描索引而无需回表。
- 最左匹配原则:最左匹配原则是指在联合索引中,如果sql语句中用到了联合索引中的最左边的索引,那么这条sql就可以利用这个联合索引去进行匹配。
- 索引下推:在联合索引的查询场景中,针对特定的过滤条件而进行减少回表次数而坐的优化
当前读和快照读
  • 当前读
    共享锁、排他锁这些操作都是一种当前读,当前读就是读取记录的最新版本,读取时还需要保证其他事务不能修改该记录,会对读取的记录加锁。
  • 快照读
    不加锁的select就是快照读,前提是隔离级别不是串行化级别,串行化的快照读会退化成当前读。之所以出现快照读,基于提高并发性能考虑。MVCC的出现,避免了加锁操作,降低了开销,基于多版本,即快照读可能读到的并不一定是数据的最新版本,可能是某一历史版本。
MVCC

MVCC就是为了实现读-写冲突不加锁,而这个读指的是快照读,而非当前读,当前读是使用悲观锁实现的。MVCC指的是"维持一个数据的多个版本,使得读写操作没有冲突",MVCC模型在mysql中的具体实现是由3个隐式字段,undo日志,Read View等去完成的。

并发场景下的几种问题:
①读-读:不存在任何问题,不需要并发控制
②读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,不可重复读,幻读
③写-写:有线程安全问题,可能会存在更新丢失问题

MVCC的好处:
①在并发场景下,读操作不阻塞写操作,写操作不阻塞读操作,提高了数据库并发读写的性能
②解决了脏读、不可重复读、幻读等事务隔离问题,但不能解决更新丢失问题

  • MVCC + 悲观锁
    MVCC解决读写冲突,悲观锁解决写写冲突
  • MVCC + 乐观锁
    MVCC解决读写冲突,乐观锁解决写写冲突

MVCC实现原理

  • 隐式字段
    ①DB_TRX_ID:最近修改事务id
    ②DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本
    ③DB_ROW_ID:隐含的自增主键
    ④实际上还有个删除flag隐藏字段,既记录被更新或删除并不代表真的删除,而是删除flag变了
mysql如何实现串行化

MVCC + next-key locks:next-key locks由record locks(索引加锁/行锁)和gap locks(间隙锁,每次锁住的不光是需要使用的数据,还会锁住这些数据附近的数据)的结合,next-key lock会锁定范围和自身行没比如select…where id < 6,锁定的是小于6的行和等于6的行。
next-ksy lock即在事务中select时使用如下方法加锁,这样在另一个事务对范围内的数据进行修改时就会阻塞:
select * from table where id < 6 lock in share mode; – 共享锁
select * from table where id < 6 for update; – 排他锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

boost互斥锁_boost锁使用总结

boost锁的概述&#xff1a;boost库中提供了mutex类与lock类&#xff0c;通过组合可以轻易的构建读写锁与互斥锁。举个通俗的例子&#xff0c;如果共享资源是一个自动锁住的房间&#xff0c;互斥体是钥匙&#xff0c;进入房间必须取钥匙&#xff0c;离开房间应该还钥匙。这就对应…

MySQL 是如何实现四大隔离级别的?

MySQL 是如何实现四大隔离级别的&#xff1f; 在mvcc下&#xff0c;mysql中用到的锁还是共享锁和排他锁么&#xff1f;如果是的话&#xff0c;那么是怎样结合锁和mvcc来实现rc和rr隔离级别的呢&#xff1f;还有mysql中在ru隔离级别下&#xff0c;两个事务同时读取数据对象A&am…

无符号右移负数_关于负数的右移与无符号右移运算小结

对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:对于负数的右移&#xff1a;因为负数在内存中是以补码形式存在的&#xff0c;所有首先根据负…

Linux命令 移动/复制文件/目录到指定目录下

1、同一个服务器下复制文件或文件夹 1.1 复制文件 复制文件&#xff1a;把1.txt 复制到根目录下的sbin目录 cp 文件名&#xff08;可带路径&#xff09;目标路径&#xff08;带路径&#xff09;如&#xff1a;cp 1.txt ~/sbin/1,2 复制目录 复制目录&#xff1a;把relea…

springboot2稳定版本_重要版本Spring Boot 2.3.0发布 - spring.io

重要版本Spring Boot 2.3.0于2020年5月15日发布&#xff0c;此版本增加了大量新功能和改进。有关完整的升级说明以及新的和值得注意的功能&#xff0c;请参阅发行说明。2.3的新功能依赖升级Spring Boot 2.3移至几个Spring项目的新版本&#xff1a;Spring Data NeumannSpring HA…

正则表达式——手机号

手机表达式&#xff1a; /^13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/ 可以校验 11为手机号&#xff0c;包含了大部分号段 座机表达式&#xff1a; /^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})(-[0-9]{1,4}){0,1}$/可以校验 区号-电话-分机 上面两条…

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException

异常信息&#xff1a; org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name BusinessAccountController for bean class [com.hs.BusinessAccountController] conflicts with existing, non-compatible bean definit…

c mysql web开发实例教程_Web开发(六)MySql

数据库简介数据库(DB)数据库(database&#xff0c;DB)是指长期存储在计算机内的&#xff0c;有组织&#xff0c;可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储&#xff0c;具有较小的冗余&#xff0c;较高的数据独立性和易扩展性&#xff0c;并可为各种…

Git——工作中使用命令详解

1、Linux常用命令 cd&#xff1a;改变目录cd…&#xff1a;返回上级目录pwd&#xff1a;显示当前目录clear&#xff1a;清屏ls&#xff1a;显示当前目录所有文件touch&#xff1a;添加文件rm&#xff1a;删除文件mkdir&#xff1a;新建文件夹rm -r&#xff1a;删除文件夹mv&am…

mac11.14 mysql_mysql 5.7 11 章 数据类型(1)

前言 这是 一篇mysql 5.7 官方手册的部分翻译&#xff0c;目的加强自己的理解 &#xff0c;和 提升英文水平。不保证质量&#xff0c;速度。部分我感觉没有多大用处的部分没有做翻译。英语手册地址 https://dev.mysql.com/doc/refman/5.7/en/data-types.html------------------…

Java中常见null简析

对于每一个Java程序员来说,null肯定是一个让人头痛的东西,今天就来总结一下Java中关于null的知识。 1.null不属于任何类型,可以被转换成任何类型,但是用instanceof永远返回false. 2.null永远不能和八大基本数据类型进行赋值运算等,否则不是编译出错,就是运行出错. 3.null可以…

怎么从mysql注册表删除用户_mysql 创建和删除用户

1.远程登录mysqlmysql -h ip -u root -p 密码2.创建用户格式&#xff1a;grant 权限 on 数据库.* to 用户名登录主机 identified by "密码"&#xff1b;例1&#xff1a;增加一个test1用户&#xff0c;密码为123456&#xff0c;可以在任何主机上登录&#xff0c;并对所…

服务报错:java.sql.SQLException: Field ‘***‘ doesn‘t have a default value

完整异常 java.lang.RuntimeException: org.springframework.dao.DataIntegrityViolationException:Error updating database. Cause: java.sql.SQLException: Field ‘***’ doesn’t have a default value 问题原因 后端接实体类无默认值&#xff0c;但是前端未传参&#xf…

centos php-mysql_centOS 下安装php和mysql

使用yum install php,yum install mysql安装apache:yum install httpd httpd-devel启动apache:/etc/init.d/httpd start此时输入服务器的IP地址&#xff0c;应该看到apache的服务页面&#xff0c;端口不用输&#xff0c;apache默认就是使用80端口安装mysql:yum install mysql m…

Chrome浏览器F5和ctrl+F5的区别

一、正常重新加载&#xff08;F5&#xff0c;Ctrl R&#xff0c;在地址栏回车&#xff0c;点击链接&#xff09; 本节中的操作&#xff1a;根据缓存的缓存策略&#xff0c;进行处理。如果缓存没过期&#xff0c;就不向浏览器发请求&#xff0c;而是直接使用缓存。 F5或Contr…

mysql 自动生成mapper_自动生成实体类、Mapper、Mapper.xml文件

自动生成实体类、Mapper、Mapper.xml文件搭建Spring Boot Mysql MyBatis 项目核心配置pom.xml创建表配置文件生成文件结果项目结构搭建Spring Boot Mysql MyBatis 项目idea 可直接创建相应的项目及配置核心配置pom.xmlmysqlmysql-connector-java5.1.38org.springframework.…

使用Postman进行简单压力测试

使用Postman可以对服务端接口进行简单的压力测试&#xff0c;步骤如下&#xff1a; 1.配置好一个请求接口&#xff0c;保存在一个collection中&#xff1b; 2.点击Tests&#xff0c;添加断言检查点&#xff1b; 3.点击Runner按钮&#xff0c;打开Collection Runner界面&#…

mysql取消主从配置_mysql主从配置

搭建环境&#xff1a;master 192.168.127.131slave 192.168.127.128主从配置的前提&#xff1a;两个数据库的数据需要一模一样所以我们&#xff1a;在主上面建立一个数据库 在这里我们用mysql备份一下mysqldump db1 >123.sql (备份)在主上面建立一个数据库db1需要登录数据…

HTTP状态码——413

status code&#xff1a;413 Request Entiry Too large上传文件失败&#xff0c;报上面的错&#xff1a;请求实体太大。 原因&#xff1a;nginx有个参数client_max_body_size在限制请求实体的大小&#xff0c;把它改大点就好了。 {如果配置文件没有这个参数&#xff0c;应该会…

利用Java zip进行对文件的压缩和解压

利用Java JDK自带 进行对文件的压缩和解压 实现一个文件的zip压缩&#xff0c;过程可以简单地表示为&#xff1a; ZipEntry:表示 ZIP 文件条目 构造方法: public ZipEntry(String name) 可以用文件的相对路径来构造ZipEntry对象 ZipOutputStream&#xff1a; ZIP 文件格式…