数据库事务与 Java 线程

DB Transaction vs Java Thread

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

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

示例: 在学生table中,事务T1持有一些行的锁,需要更新年级table中的一些行。同时,事务 T2 持有成绩 table 中某些行的锁,需要更新事务 T1 持有的 Student table 中的行。

我的问题是:

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

提前致谢。

  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,等等)数据库是服务器上的运行,每个查询都是独立的。事务是一种数据库机制,用于确保数据在查询之间是一致的,并且没有其他进程在进程中修改它们。

一个例子。

让我们假设我们正在经营一家提供产品的在线商店。 A table Stocks 包含每个库存产品的数量。

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

没有交易会发生什么:

  • 客户 1 尝试订购产品。
  • 他们检查库存情况并开始订购流程
  • 与此同时,客户 2 尝试订购相同的产品。他们将其视为 'in stock' 并开始订购。
  • 谁先付款,谁就得到他们的产品,另一个顾客付款,然后得到一个“抱歉,该物品已卖给另一个顾客,我们会在有货时回复您”

有交易:

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

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

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