【问题标题】:DB Transaction vs Java Thread数据库事务与 Java 线程
【发布时间】:2021-02-04 21:29:42
【问题描述】:

我的问题可能是错误的。原谅我。

我在执行事务时阅读了下面的死锁示例。

示例: 在student表中,事务T1持有一些行的锁,需要更新grade表中的一些行。同时,事务 T2 对成绩表中的某些行持有锁,需要更新事务 T1 持有的 Student 表中的行。

我的问题是:

  1. 在使用线程时,我们可以得到死锁,好的,但是为什么在使用事务时会发生死锁?
  2. 事务和java线程是一样的吗?请不要给出定义!
  3. 是事务、DB 相关还是 Java 程序相关?
  4. 我们为什么要在你的 java 代码中配置 @Transactional 上面的方法,如果它与 DB 相关?
  5. 为什么 DB 使用事务而不是线程? 谁能举个清晰的例子。

提前致谢。

【问题讨论】:

    标签: java database multithreading transactions


    【解决方案1】:
    1. 当两个进程(或线程)都试图访问锁定的数据并以防止其被解锁的方式处理它时,就会发生死锁。锁定对数据的访问通常发生在事务中,否则就没有意义。

    此类交易的示例:

    1. transaction start
    2.  lock grades for student A
    3. Calculate average for the term
    4. commit changes
    5. end transaction - unlock data
    
    1. 没有。线程是一个子进程。为相似起见,您可以将其视为一个单独的程序。事务是一种数据库机制,允许您将多个查询作为一个执行,并带有可选的数据锁定,并确保数据不会在另一个用户或进程(例如应用程序的另一个线程)的查询之间发生更改

    2. 事务与数据库相关。

    3. 表示它处理交易

    4. 线程是您的程序(java 等)的概念。数据库在服务器上运行,每个查询都是隔离的。事务是一种数据库机制,可确保查询之间的数据保持一致,并且没有其他进程在进程中修改它们。

    一个例子。

    假设我们正在经营一家产品在线商店。一个表 Stocks 包含库存中每种产品的数量。

    假设我们有产品 A,我们正好有一个库存。

    没有交易会发生什么:

    • 客户 1 尝试订购产品。
    • 他们检查库存情况并开始订购流程
    • 同时,客户 2 尝试订购相同的产品。他们将其视为“有货”并开始订购。
    • 谁先付款,拿到他们的产品,另一位客户付款,然后收到“抱歉,该商品已出售给另一位客户,我们会在有货时回复您”

    有交易:

    • 客户 1 开始订购。在订单发生时,商品库存被交易锁定
    • 客户 2 开始订购。在事务 1 完成之前事务不会开始。然后他们看到产品缺货,却没有下单。

    该示例可能不是真实的(电子商店以不同的方式处理此问题),但可以让您了解交易的工作原理。

    一个更简单的例子是一个计数器,它的值存储在数据库中。要增加一个计数器,您需要先读取它的值,然后向它添加“一”。如果计数器正在使用事务,则所有读取尝试都会排队或拒绝,直到更新完成。如果没有事务,两个进程可能会增加相同的值,从而导致计数器增加一次,而不是两次。

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多