首页 > 数据库 >SQL事务隔离级别

SQL事务隔离级别

时间:2024-04-18 20:24:04浏览次数:21  
标签:事务 读取 数据 提交 SQL 授权 级别 隔离

  事务的隔离性是指:在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。

  在标准的SQL规范中,定义了4种事务隔离级别,不同的隔离级别对事务的处理不同。包括:未授权读取、授权读取、可重复读取和串行化。

  • 未授权读取

概念:未授权读取也被称为读未提交。指一个事务能够读取到另一个事务中没有提交的更新数据。事务可以读取到其它事务未提交的数据,也被称为脏读。

说明:事务A和事务B在同时执行,事务A对某项数的值从1开始进行加1操作,直到加到10后提交,在此过程中,事务B查询该数据时,可以看到数据2、3......9的所有中间值,对这一系列中间值的读取就称之为脏读。

脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。

原因:

  • 授权读取

概念:授权读取也被称为读已提交。授权读取只允许获取已经被提交的数据。

说明:事务A和事务B在同时执行,事务A对某项数的值从1开始进行加1操作,直到加到10后提交。在事务A提交之前,事务B查询该数据为1;在事务A提交之后,事务B查询该数据为10。事务B无法看到数据2、3......9的所有中间值。授权读解决了未授权读产生的脏读问题。但若此时事务B还未结束,在事务C将该数值改为20后提交后,事务B去查询该数值将为30。对于这种在同一事务内多次读取同一数据但产生不同结果的情况称为不可重复读。授权读取允许不可重复读。

不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据。

原因:

  • 可重复读取

概念:保证在同一事务处理过程中,多次读取统一数据时,其数值和开始时刻是一致的。该事务级别禁止了脏读取和不可重复读取,但是有可能出现幻影数据(即幻读)。

说明:

幻读:指一个线程中的事务读取到了另外一个线程中提交的insert的数据。所谓幻读,是指事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。 此时事务A再次查询数据会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

解决方案:一般解决幻读的方法是增加范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。

  • 串行化

概念:是最严格的事务隔离级别。它要求所有事务都被串行执行,即在读取的每一行数据上都加上了锁,使读写相互都会阻塞,不允许事务并发执行。隔离级别最高,是最安全,不会出现脏读、不可重复读、幻读,和丢失更新。但性能最低。

  • 隔离级别示意图:

 

标签:事务,读取,数据,提交,SQL,授权,级别,隔离
From: https://www.cnblogs.com/DeepInThought/p/10769358.html

相关文章

  • MySQL常用管理命令、常用函数小计
    1、Windows系统是MySQL服务器的关闭、重启 (mysql为服务名)关闭服务:netstopmysql启动服务:netstartmysql 2、连接mysql服务器在cmd窗口执行命令:mysql-h127.0.0.1-P3306-uroot-p -h127.0.0.1:指定主机IP  -P3306:执行mysql服务端口......
  • MySQL-8.0.33-winx64 解压版安装 [Windows]
    1、下载安装包mysql-8.0.33-winx64.ziphttps://dev.mysql.com/downloads/file/?id=5182202、安装解压mysql-8.0.33-winx64.zip(至:C:\app\mysql-8.0.33-winx64);创建my.ini文件;默认解压目录无my.ini文件,需自己创建;进入目录C:\app\mysql-8.0.33-winx64,创建my.ini,文件内容......
  • Mac 使用 brew 安装 mysql
    ##搜索可用版本brewsearchmysql##安装制定版本[email protected]##重点需要关注的安装日志如下==>[email protected]==>[email protected]_1.sonoma.bottle.tar.gz==>/usr/local/Cellar/[email protected]/8.0.36_1/bin/mysqld--initialize-insecure-......
  • 云原生之在kubernetes集群下部署mysql应用
    一、Mysql介绍数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。MySQL是一种开源的关系型数据库管理系统,可将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内,从而加快了访问速度并提高了灵活性。MySQL使用了标准的SQL语言形式。支持大型的数据库,可以处理......
  • MySQL里 没有 boolean类型 怎么办?MySQL 里的 tinyint(1)
    之前我写的博客:https://www.cnblogs.com/del88/p/12538470.html由于之前的博客,没有使用markdown懒得重新排版了,重新写一篇;直接看AI给的答案吧:MySQL里没有boolean类型怎么办?在MySQL中,确实没有专门的boolean数据类型。不过,MySQL通常使用TINYINT(1)作为布尔值的替代。当使用T......
  • 在 SQL Server 中 你可以使用以下查询来找到引用 的 FOREIGN KEY 约束
    SELECTf.nameASForeignKeyName,OBJECT_NAME(f.parent_object_id)ASReferencingTable,COL_NAME(fc.parent_object_id,fc.parent_column_id)ASReferencingColumn,OBJECT_NAME(f.referenced_object_id)ASReferencedTable,COL_NAME(fc.referenced_object_id,fc.re......
  • MYSQL 8 窗口函数的优点
    窗口函数的特点是可以分组,而且可以在分组内排序。另外,窗口函数不会因为分组而减少原表中的行数I这对我们在原表数据的基础上进行统计和排序非常有用。递归调用 复杂报表统计能力增强:窗口函数允许在数据集(窗口)内进行行级别的运算,而不会像传统聚合函数那样折叠所有行到单个输......
  • java-mysql-语法
    条件查询1.条件运算符:>,<,=,!=,<>2.按逻辑表达式:&&,||,!and,or,not &&和and:两个条件都为true.结果为true,反之为false ||和or:只要有一个条件为true,结果就为true,反之为false !和not:如果连接的条件本身就为false,结果为......
  • MSSQL 数据库服务器磁盘空间报警 -
    如服务器上有创建MSSQLReplication,则会自动创建distribution数据库,有时distribution数据库日志文件过大解决方案:1.第一种方案:查看日志大小, dbccsqlperf(logspace),查看哪个数据库日志文件过大,如果有数据库日志文件非常大,就需要通过检查日志的VLF使用情况来进行诊断,日志文件......
  • pandas读取sql文件出现:告警UserWarning: pandas only supports SQLAlchemy connectabl
    ​错误原因:导入sql的方式更新了解决方法:importpandasaspdfromsqlalchemyimportcreate_engineMYSQL_HOST='localhost'MYSQL_PORT='3306'MYSQL_USER='root'MYSQL_PASSWORD='123456'MYSQL_DB='cldk_data'engine=......