MySQL数据库——事务隔离级别Read uncommitted(一)

本文详细介绍了MySQL数据库的事务隔离级别中的Read Uncommitted级别,通过场景分析和模拟演示展示了脏读、不可重复读和幻读问题,帮助读者理解在该隔离级别下可能出现的并发问题。
摘要由CSDN通过智能技术生成

一、设置事务隔离级别

首先,我们先设置MySQL事务隔离级别为READ-UNCOMMITTED

  1. 在my.ini配置文件最后加上如下配置
#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = READ-UNCOMMITTED
  1. 当前session修改,登录MySQL数据库后执行如下命令:
set session transaction isolation level read uncommitted;

二、事务问题

同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题,这些问题可分为如下三种类型:脏读(Drity Read)、不可重复读(Non-repeatable read)、幻读(Phantom Read)

1、脏读

又称无效数据的读取,是指在数据库访问时,事务A将某值修改,在事务A commit前,事务B读取了该值,而此后因某些原因事务A rollback了对该值的修改,这就导致了事务B读取到的数据是无效的。
e.g.已知有两个事务A和B, A读取了已经被B更新但还没有被提交的数据,之后,B回滚事务,A读取的数据就是脏数据。

(1) 场景

公司发工资了,领导把5000元打到Tom的账号上,但是该事务并未提交,而Tom正好去查看账户,发现工资已经到账,账户多了5000元,非常高兴,可是不幸的是,领导发现发给Tom的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,Tom再次查看账户时发现账户只多了2000元,因此Tom空欢喜一场……

(2) 分析

上述情况即为脏读,两个并发的事务:“事务B:领导给Tom发工资”、“事务A:Tom查询工资账户”,事务A读取了事务B尚未提交的数据。

(3) 模拟演示

创建表

create table account(
	id int(36) primary key comment '主键',
  card_id varchar(16) unique comment '卡号',
  name varchar(8) not null comment '姓名',
  balance float(10,2) default 0 comment '余额'
)engine=innodb;

插入数据

insert into account (id,card_id,name,balance) values (1,'6226090219290000','Tom',1000);

结果
在这里插入图片描述
公司发工资了,领导把5000元打到Tom的账号上,但是该事务并未提交。30秒后将工资数额改为2000元。

public class Boss {
   //公司给Tom发工资

	public static void main(String[] args) {
   
		Connection connection = null;
		Statement statement = null;
		try {
   
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://127.0.0.1:3306/test";
			connection = DriverManager.getConnection(url, "root", "root");
			connection.setAutoCommit(false);
			statement = connection.createStatement();
			String sql = "update account set money=money+5000 where card_id='6226090219290000'";
			statement.executeUpdate(sql);
			Thread.sleep(30000);//30秒后发现工资发错了
			connection.rollback();
			sql = "update account set money=money+2000 where card_id='6226090219290000'";
			statement.executeUpdate(sql);
			connection.commit();
		} catch (Exception e) {
   
			e.printStackTrace();
		} finally {
   
			//释放资源
		}
	}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值