如何查看 JDBC / MySQL 的 TRANSACTION_REPEATABLE_READ 操作?

2024-01-10

我的计算机上当前运行 MySQL 服务器 (5.7.16),并且此服务器上名为“Sakila”的数据库中有此示例行:

mysql> SELECT * FROM actor WHERE last_name = 'tugay';
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|      201 | koray      | tugay     | 2017-06-11 21:42:08 |
+----------+------------+-----------+---------------------+

这是 JDBC 返回的 MySQL 服务器事务隔离级别:

public static void main(String[] args) throws SQLException, InterruptedException {
    final Connection connection = getConnection("jdbc:mysql://localhost:3306/sakila", "root", "root");
    System.out.println(connection.getTransactionIsolation()); // Prints 4!
    connection.close();
}

where 4这是常数TRANSACTION_REPEATABLE_READ这是有记录的 https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#TRANSACTION_REPEATABLE_READ如下:

int TRANSACTION_REPEATABLE_READ  = 4;
A constant indicating that dirty reads are prevented. 
This level prohibits a transaction from reading a row with uncommitted changes in it.

我想看到这种行为,所以我有两个主要方法,第一个是:

import java.sql.*;

import static java.sql.DriverManager.*;

public class Foo {

    public static void main(String[] args) throws SQLException, InterruptedException {
        final Connection connection = getConnection("jdbc:mysql://localhost:3306/sakila", "root", "root");
        connection.setAutoCommit(false);

        final Statement statement = connection.createStatement();
        statement.executeUpdate("UPDATE actor SET first_name = 'ALTERED' WHERE first_name = 'koray'");

        System.out.println("Sleeping!");

        // Here I am expecting MySQL to lock the Row so no other Connection
        // can read data from it. This row will be updated, so unless the transaction is 
        // either commited or rolled back, the read data will be 'dirty'.
        Thread.sleep(5000);

        connection.commit();
        connection.close();
    }
}

如您所见,交易是not在自动提交模式下,我锁定该行 5 秒。当这个进程处于睡眠状态时,我也不断运行以下代码:

public class Bar {

    public static void main(String[] args) throws SQLException, InterruptedException {
        final Connection connection = getConnection("jdbc:mysql://localhost:3306/sakila", "root", "root");
        connection.setAutoCommit(false);

        final Statement statement = connection.createStatement();
        final ResultSet resultSet = statement.executeQuery("SELECT * FROM actor WHERE last_name = 'tugay'");

        resultSet.next();
        System.out.println(resultSet.getString("first_name"));

        connection.close();
    }
}

但即使我在控制台中看到“睡眠”文本,只要我在 Bar 中运行 main 方法,我就会看到类似的值

koray
koray
koray
ALTERED

我的期望是永远见不到科雷因为这是一个“脏数据”,第一个 java 进程应该锁定该行。

我缺少什么以及如何锁定这一行?


您应该再次阅读定义:

该级别禁止事务读取未提交的行 其中的变化。

ALTERED 是脏数据,因为它没有提交。科雷是正确的。酒吧禁止看到“ALTERED”。只要交易未提交,您就会一直看到“koray”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查看 JDBC / MySQL 的 TRANSACTION_REPEATABLE_READ 操作? 的相关文章

随机推荐

  • 如何使用 Kotlin 修复此错误,找不到 Fragment 构造函数?

    我正在开发Android使用 Kotlin 的应用程序 在我的应用程序中包含Tab with ViewPager所以我实现了两个选项卡 当我移动到另一个活动并压缩到选项卡视图活动时 应用程序将停止并且logcat显示下面的错误 java l
  • 如何使用模板创建排序映射整数索引

    我有数据结构 template
  • 使用 C# 删除换行符

    我从名为 Description 的数据库字段获取一个字符串 它有换行符 它看起来像这样 项目标题 此处为描述 这是项目的描述 我怎样才能删除换行符 我尝试了以下功能 但它不起作用 public string FormatComments
  • 设置div动态填充剩余高度?

    所以 我的代码类似于 div style width 100 min height 1 display block background color 000 img src header image svg div div Some con
  • 在 Python 中检测 NUMLOCK / CAPSLOCK / SCRLOCK 按键/按键

    在我正在开发的游戏中 我想检测NUMLOCK keypress or keyup 就像在按下时注册一个 回调 函数 我并不是要求阅读它state在某一特定时刻 我已经可以做到了 https github com MestreLion pyr
  • 有没有办法在设置类的任何属性时调用方法?

    因此 我想做的是在设置 C 类中的任何属性时调用单个 propertyWasSet 函数 相反 在获取属性时调用 propertyWasGot 我还想知道调用了哪个属性的 get 我想维护一个 设置 属性的字典 并检查 获取 操作是否已设置
  • Angular 库包依赖项

    我使用 CLI 创建并捆绑了一个 Angular 7 2 0 库 ng g 库 MyLibrary ng 构建 MyLibrary 这给了我my libary umd js我需要的捆绑包 目前 所有依赖项都作为peerDependency
  • 如何在同一场战争的多个 jar 中使用相同的 CamelContext

    我使用的是camel 2 16 2 我需要在多个jar 中使用一个 CamelContext 因为我需要将所有 Camel 路由器放入一个 CamelContext 中 所以我的战争将把所有这些罐子作为 Maven 工件 请告诉我如何处理上
  • 设施位置的动态规划算法

    沿着一条线 在位置 a 1 a 2 a n 处有 n 栋房屋 我们希望沿着同一条线设置移动便盆 以便每间房屋都位于至少一个移动便盆的距离 R 内 这些便携式便盆仅限于指定位置 b 1 b 2 b m 令 c i 为在位置 b i 设置移动便
  • openapi-generator 复制 swagger-ui 中的端点

    openapi generator maven plugin 版本 6 3 0 在 Spring Boot 3 应用程序中配置如下
  • 分区比排序更容易吗?

    这是一个在我脑海里徘徊了一段时间的问题 假设我有一个项目列表和它们的等价关系 并且比较两个项目需要恒定的时间 我想退回一部分物品 例如链表的列表 每个链表包含所有等效项 实现此目的的一种方法是将等价性扩展到项目的排序并对其进行排序 使用排序
  • 在无向图中记录 DFS 搜索中的前驱

    我试图使用此线程中的代码 提升DFS back edge https stackoverflow com questions 19346820 boost dfs back edge 19391511 noredirect 1 commen
  • String.count() 是如何工作的? [复制]

    这个问题在这里已经有答案了 我是 python 和学习的新手 如所给出的here https www tutorialspoint com python string count htm count 方法在字符串上使用时给出子字符串在字符串
  • 如何为Java类创建两个接口,一个只读,一个读写?

    我正在用 Java 为一款两人纸牌游戏编写一个游戏引擎 我的学生将为该游戏编写 AI 玩家 人工智能玩家将轮流在他们面前的 桌子 的 场地 上打牌 他们可以用自己场上的牌攻击对方场上的牌 卡片可以面朝上或面朝下 GameEngine 类允许
  • 如何根据构建变体更改 AndroidManifest.xml 文件?

    我有一个具有多个构建变体的应用程序 这些变体用于为不同公司构建同一应用程序的版本 因此 我有几个不同的变体来构建不同的应用程序 com acme app1 com schmoe app2 com yop app3 etc build gra
  • 指定服务返回字段的最佳方法

    我们使用 Java EE 7 和 WildFly 9 来开发移动 Web 应用程序的自定义后端 后端是一个经典的三层系统 具有通信逻辑 JAX RS 业务逻辑 Session EJB 和持久层 Hibernate 业务逻辑层由一组服务组成
  • 压缩输出与 Go to Ruby 实现不同

    我正在实现一个程序 将文件压缩为 git blob 并适当存储它 我有一个红宝石参考实现 https github com sgen git deflate blob bugfix deflate deflate file这是基于git 书
  • “找不到主类。程序将退出”

    我正在尝试运行 SQuirreL SQL 我已经下载并安装了它 但是当我尝试运行它时 我收到以下错误消息 Java 虚拟机启动器 无法找到主类 程序将会退出 我明白了这一点 但我不知道如何解决它 有什么帮助吗 更多信息 我使用的是 Wind
  • Win32_Product 的替代品?

    尝试查询后Win32 Product寻找软件版本时 我无法理解为什么结果如此缓慢 比查询慢15倍Win32 service or Win32 process 所以来这里看看我是否遗漏了什么 我发现其他人也报告了同样的问题 而这个articl
  • 如何查看 JDBC / MySQL 的 TRANSACTION_REPEATABLE_READ 操作?

    我的计算机上当前运行 MySQL 服务器 5 7 16 并且此服务器上名为 Sakila 的数据库中有此示例行 mysql gt SELECT FROM actor WHERE last name tugay actor id first