【问题标题】:Transaction isolation and concurrency事务隔离和并发
【发布时间】:2023-03-25 18:12:02
【问题描述】:

我正在尝试使用 Connector/J 和 MySql 在 Java(JDK1.8) 中构建应用程序。听说 Serializable 是最高级别,但是会影响性能,所以 Serializable 不被普遍采用。

但考虑一下这种情况:

有两个提交将更新同一行的字段(提交 A 和提交 B)。如果 A 和 B 同时发生并且隔离级别不是 Serializable,则会出现数据竞争,从而导致字段不一致。但是在可序列化级别中,这两个更新不会同时发生,因此 A 发生在 B 之前或 B 发生在 A 之前,并且该行将在版本 A 或版本 B 中,但不是 A 和B.

我认为 ACID 的原子性保证了 A 和 B 的同步。但似乎原子性的定义只保证一个事务发生“全有或全无”,它没有说明并发提交。

那么我应该使用 Serializable 来防止数据竞争吗?哪一种 ACID 真正保证了一次更新的原子性?

【问题讨论】:

  • 似乎您只是因为必须编写一些 JDBC 代码而尝试学习 RDBMS 概念。恕我直言,如果您首先尝试直接在 MySQL 上学习这些(事务...),对您来说会容易得多。您可以使用 MySQL 工作台或命令行客户端,以不同的隔离开始/提交多个事务。这样就更容易掌握 JDBC 必须提供什么以及选择/使用什么。

标签: java database concurrency transactions isolation-level


【解决方案1】:

没有。为避免您描述的问题,您不需要“可序列化”。还有其他隔离级别。你害怕的事情只会发生在“未提交的阅读”中。对于任何其他隔离级别,单个记录中的字段将始终保持一致。

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2011-09-30
    • 2015-06-14
    相关资源
    最近更新 更多