MySQL事务并发问题

news/2024/10/18 23:25:25/

当有多个事务同时访问数据库中的同一个数据时,如果没有采取必要的隔离机制,就会导致各种并发错误发生。

两个事务t1,t2:

①脏读: 当t2正在更新某个字段但还没有提交数据库执行时,t1在这个时刻正好读取这个字段的数据,然后t2在发生错误,然后回滚数据,导致t1读取到数据就是t2更新时的临时数据,而且最终没有更新成功的无效数据!

②不可重复读:t1读取一个字段是数值,然后t2更新了这个字段,之后t1在读取同一个字段,值发生了变化!

③幻读:t1读取一个字段是数值,然后t2对这个字段插入新数值,t1在读突然就多了几行数据.

数据库事务的隔离性:数据库必须具有隔离这种并发运行的事务的能力,避免这些个错误现象!

一个事务与其他事务隔离的程度称为隔离级别:数据库规定了事务隔离级别,不同隔离级别对应不同的干扰程度,级别越高,数据一致性越好,但并发性越弱!

MySQL数据库支持四个不同隔离级别,这四个有底到高的级别是:

read uncommitted; 读未提交数据

read commited; 读已提交数据

repeatable read; 可重复读(默认)

serialable; 串行化

演示隔离级别:

(在cmd命令窗口演示,要模拟并发情况,需要不同客户端)

①net stop mysql , net start mysql 重启mysql数据库,清除隔离级别

②登录进入myslq mysql -u root -proot

③查看当前的隔离级别 select @@tx_isolation;

④设置成最低的级别 set session transaction isolation level serialable;

⑤进入test 库 use test;

⑥查看account表 select * from account;

⑦开启事务 set autocommit=0;

⑧修改数据 update account set username='C' where id=1; 注意这里没有事务提交

⑨在开一个dos窗口,连上mysql,模拟另一个事务

myslq mysql -u root -proot
select @@tx_isolation;
set session transaction isolation level read uncommitted;
use test;
select * from account;
set autocommit=0; //开启一个新的事务
select * from account; //这时候你看到查到的数据是C,但是前一个事务并没有提交

⑩结束事务:原来的事务回滚 rollback

这里只是演示了一下脏读,其他实验你们自己做一下

结论先告诉你们:

第一个级别,前面讲的问题现象都是存在的.

第二级别: 脏读没有了,但不可重复读和幻读仍然有

第三级别:没有脏读,没有不可重复读,仍然有幻读

第四个级别:可以解决所有问题! 会使性能十分低下


http://www.ppmy.cn/news/1443391.html

相关文章

【kettle006】kettle访问华为openGauss高斯数据库并处理数据至execl文件

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下华为openGauss高斯数据库相关知识体系 3.欢迎批评指正,跪谢…

负载均衡简介

负载均衡是分布式系统中一种重要技术,用于优化资源使用、提高服务可用性和响应速度,确保系统的扩展性和可靠性。主要的负载均衡种类包括以下几种: 1. **硬件负载均衡**: - **概念**:通过专门设计的硬件设备来分发网…

FlyFlow:全新开源版问世,支持SpringBoot3+Flowable7

经过精心打磨和严格测试,我们隆重推出全新FlyFlow开源版,这款源自商业版的强大工具,如今已完美融入SpringBoot3和Flowable7两大核心框架,为开发者带来前所未有的便捷与高效。 SpringBoot3的加持,让FlyFlow在简化开发流…

视频录制全攻略,这3个技巧一看就会!

随着信息技术的飞速发展,视频录制已成为人们日常工作和生活中的重要需求。无论是教学演示、产品介绍还是会议记录,视频录制都能帮助我们更直观、更生动地传达信息。本文将详细介绍三种常用的视频录制方法,帮助读者轻松掌握视频录制的技巧&…

C++-DAY5

有以下类&#xff0c;完成特殊成员函数 #include <iostream>using namespace std; class Person {string name;int *age; public://有参构造Person(string name,int age):name(name),age(new int(age)){}//析构函数~Person(){delete age;}//拷贝构造Person(const Person …

docker 集群管理实战mesos+zookeeper+marathon(一)

一 实验环境 1.1 系统版本&#xff0c;本实验使用cnetos7.9版本镜像 1.2 准备5台虚拟机&#xff0c;其中3台master&#xff0c;两台slave&#xff0c;使用克隆的方式 1.3 使用远程连接工具登录 1.4 修改主机名 1.5 设置域名映射 每个虚拟机都配置一下&#xff0c;这里就演示一…

web安全---CSRF漏洞/OWASP-CSRFTester的使用

what 跨站请求伪造 Cross Site Request Forgery how 攻击者诱骗点击恶意网页&#xff0c;盗用&#xff08;伪造&#xff09;受害者的身份&#xff0c;以受害者的名义向服务器发送恶意请求,而这种恶意请求在服务端看起来是正常请求 CSRF&&XSS区别 他们最本质区别就…

深度学习pytorch小实验

让我们开始进行一个简单的深度学习实验吧&#xff01;我们将使用PyTorch来实现。在这个实验中&#xff0c;我们将训练一个基本的人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;来进行手写数字的识别。首先&#xff0c;我们需要导入相关的库和模…