mysql中数据库的并发事务问题
1.脏读(dirty-read):如果第二个事务查询到第一个事务还未提交的更新数据,就会形成脏读。
2.幻读/虚读(phantom read):一个事务执行两次,如果出现第二次事务执行比第一次多一些或少一些数据,造成两次查询结果不一致。可能是另一个事务在两个事务直接插入或删除一些数据造成的。
3.不可重复读():两次事务两次读取同一行数据,结果得到不同的状态结果,如果正好中间另一个事务更新了数据,两次结果相异,不可信任。
针对以上问题,通过设置事务隔离级别来解决。
以MYSQL数据库为例,事务隔离级别:
y:可以解决;n:不能解决
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
| Read uncommotted(读未提交) | n | n | n |
| Read committed(读提交) | y | n | n |
| Repeatable read(可重复读取)(mysql默认) | y | y | n |
| Serializable(可序化) | y | y | y |
隔离级别查看:
SELECT @@tx_isolation;
第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。
特点:一写多读,写的时候,其他事务也能读
却可能出现脏读,也就是说事务B读取到了事务A未提交的数据,出现不可重复读问题,B同时读取了A提交前后某一行数据,数据不一致,也避免不了幻读问题,在此就不举例了。
第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
特点:一个事务写这个表时,其它事务不可读,只能读写后的。
只解决了脏读问题
第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读(即一个事务在进行读某一行数据时,另一个事务对这行数据所在表进行了数据条数的增减,导致查询结果不一致)。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。
特点:一个事务执行结束前,同一行数据只能在一个事务内读写,其他事务不能操作。
解决了脏读、不可重复读,但是还会出现幻读
第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行。
特点:只能一个事务来读写这个表,其他事务没有读写权限。
不仅可以避免脏读、不可重复读,还避免了幻读
补充:以上四种级别,在实际效率方面,由高到低,也就是说安全级别高,也会导致效率的下降
mysql中数据库的并发事务问题的更多相关文章
- MySQL InnooDB引擎之并发事务问题以及隔离级别的作用和区别
最近在复习MySQL事务,但网上很多博客和资料可以说讲的不是模棱两可就是只有文字描述不够形象易懂,下面通过我的学习来详细讲一讲事务并发都会引起哪些问题?以及隔离级别是什么?InnoDB引擎是如何通过隔 ...
- mysql中的视图、事务和索引
视图: 对于一个sql查询,如果发生了修改,就需要修改sql语句. 我们可以通过定义视图来解决问题.改变需求之后就改变视图. 视图是对查询的封装 定义视图: create view 视图名称 as s ...
- MySql中innodb存储引擎事务日志详解
分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...
- mysql中数据库database、实例instance、会话session的关系
1. No suitable driver found for http://127.0.0.1:3306/test jdbc_url错误,jdbc走自己的协议. 正确的路径应该是:jdbc:mysq ...
- 查找mysql中未提交的事务
1.查找未提交事务 在mysql中运行: select t.trx_mysql_thread_id from information_schema.innodb_trx t 2.删除线程 kill ...
- mysql中的存储过程和事务隔离
※存储过程存储过程是保存在数据库上的一段可执行代码.1.定义存储过程的语法是:Create procedure sp_name (参数..)Begin SQL语句End;2.调用它的方法:Call s ...
- mysql中的触发器和事务的操作
触发器 语法 创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigge ...
- 用命令查看Mysql中数据库、表的空间大小
要想知道每个数据库的大小的话,步骤如下:1.进入information_schema 数据库(存放了其他的数据库的信息)use information_schema;2.查询所有数据的大小:selec ...
- MYSQL中默认隐式事务及利用事务DML
一:默认情况下,MySQL采用autocommit模式运行.这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中.默认级别为不可重复读. 二:会造成隐式提交的语句以下语 ...
- 修改mysql中数据库存储主路径
一.首先把mysql的服务先停掉. 二.更改MySQL配置文件My.ini中的数据库存储主路径 打开文件夹C:\ProgramData\MySQL\MySQL Server 5.7中的my.ini文件 ...
随机推荐
- List集合转换成数组
我现在有个需求:将File集合转换成MultipartFile数组结构 然后我就开始在网上开启了List转换到数组之旅. 首先来看一个例子 ArrayList<String> list=n ...
- 3.Linux安装docker
Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中. 进入docker官网找到安装文档 https://docs ...
- mongoDB日常操作01
//serialno_info.i,查看历史最大值db.serialno_info.find({'_id':'define_picture'})//查看文件记录有序id条数db.fs.files.fi ...
- jquery语言中获取input标签后如何给input标签添加disabled的属性
jquery语言中获取input标签后如何给input标签添加disabled的属性 1.使用JQuery函数prop():$("input").prop("disabl ...
- Unity生成AB包和加载AB包
unity生成AB包 生产AB包,编辑器脚本放在Editor文件夹下(切记) 如果你是PC包 BuildTarget.WebGL 后面要改成PC (BuildTarget.StandaloneWin ...
- python ElementTree 节点标签修改
在网上能找到很多关于xml库ElementTree的增删改查用法,这里我就不重复写那么多了. 主要记录一个,不是很容易查到的用法,比如一个标签,<name></name>,我需 ...
- XSStrike-20220320
Usage: xsstrike.py [-h] [-u TARGET] [--data PARAMDATA] [-e ENCODE] [--fuzzer] [--update] [--timeout ...
- ts补充
// ts中类型主要包括 1.元组 2.接口(对象,函数,构造器)类型 3.枚举类型 4.字面量类型 5.特殊类型 // ts中类型类型运算主要包括 1.条件类型 : 2.推导类型 3.联合类型 4. ...
- <<Python编程:从入门到实践>>踩坑记 Django
<<Python编程:从入门到实践>>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是 ...
- java发送短信验证码带倒计时
分享一个完整的java发送短信验证码的完整实例,这是一个官方的使用demo,带有60秒倒计时功能. 效果: 我使用的是榛子云短信平台, 官网地址:http://smsow.zhenzikj.com 我 ...