MySQL数据库——事务隔离级别Repeatable read(三)

3、Repeatable read(重复读)

可以避免脏读和不可重复读,但是有可能出现幻读。

设置MySQL的事务隔离级别为REPEATABLE-READ
在my.ini配置文件最后加上如下配置,然后在服务中重启MySQL服务

[mysqld]
transaction-isolation = REPEATABLE-READ

查询当前的事务隔离级别
在这里插入图片描述

脏读

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

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);

表中数据
在这里插入图片描述
老板类

import java.sql.*;
public class Boss {
   
	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 balance=balance+5000 where card_id='6226090219290000'";
			statement.executeUpdate(sql);
			Thread.sleep(30000);//30秒后发现工资发错了
			connection.rollback();
			sql = "update account set balance=balance+2000 where card_id='6226090219290000'";
			statement.executeUpdate(sql);
			connection.commit();
		} catch (Exception e) {
   
			e.printStackTrace();
		} finally {
   
			//释放资源
				try {
   
					if(statement != null) {
    
						statement.close();
					}
				} catch (SQLException e) {
   
					e.printStackTrace();
				}
				try {
   
					if(connection != null) {
   
						connection.close();
					}
				} catch (SQLException e) {
   
					e.printStackTrace();
				}
		}
	}
}

员工类

import java.sql.*;
public class Employee {
   
	public static void main(String[] args) {
   
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
   
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://127.0.0.1:3306/test";
			connection = DriverManager.getConnection(url, "root", "root");
			statement = connection.createStatement();
			String sql = "select balance from account where card_id='6226090219290000'";
			resultSet = statement.executeQuery(sql);
			if(resultSet.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值