gpt4 book ai didi

java - 事务隔离级别与表上的锁的关系

转载 作者:IT老高 更新时间:2023-10-28 11:32:26 26 4
gpt4 key购买 nike

我已经阅读了大约 4 个隔离级别:

Isolation Level       Dirty Read    Nonrepeatable Read  Phantom Read  
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --

我想了解每个事务隔离对表的锁

READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)

以下是事务隔离中可能出现的三种现象
脏读- 没有锁
Nonrepeatable Read - 没有脏读作为对已提交数据的锁定
幻读 - 锁定sql block (使用select查询选择)

我想了解我们在哪里定义这些隔离级别:仅在 jdbc/hibernate 级别或也在 DB 中

PS:我已经浏览了 Isolation levels in oracle 中的链接。 ,但他们看起来很笨拙,并且谈论特定于数据库的内容

最佳答案

I want to understand the lock each transaction isolation takes on the table

例如,您有 3 个并发进程 A、B 和 C。A 启动事务、写入数据和提交/回滚(取决于结果)。 B 只是执行 SELECT语句读取数据。 C 读取和更新数据。所有这些过程都在同一张表 T 上工作。

  • READ UNCOMMITTED - 表上没有锁。您可以在写表的同时读取表中的数据。这意味着 A 写入数据(未提交),B 可以读取此未提交数据并使用它(用于任何目的)。如果 A 执行回滚,B 仍然读取并使用了数据。这是处理数据的最快但最不安全的方式,因为可能会导致在物理上不相关的表中出现数据漏洞(是的,在实际应用中,两个表可以在逻辑上但在物理上不相关 =\)。
  • READ COMMITTED - 锁定已提交的数据。您可以读取仅提交的数据。这意味着 A 写入数据而 B 无法读取 A 保存的数据,直到 A 执行提交。这里的问题是 C 可以更新在 B 上读取和使用的数据,而 B 客户端将没有更新的数据。
  • REPEATABLE READ - 锁定一个 SQL block (使用 select 查询选择)。这意味着 B 在某些条件下读取数据,即 WHERE aField > 10 AND aField < 20 , A 在 aField 处插入数据值在 10 到 20 之间,然后 B 再次读取数据并得到不同的结果。
  • SERIALIZABLE - 锁定一个完整的表(在该表上触发 Select 查询)。这意味着,B 读取数据并且没有其他事务可以修改表上的数据。这是处理数据的最安全但最慢的方式。另外,由于一个简单的读操作锁定了,这会导致生产上的严重问题:假设 T 表是 Invoice 表,用户 X 想知道当天的发票,用户 Y 想创建一张新发票,所以当 X 执行发票读取时,Y 不能添加新发票(当涉及到钱时,人们真的很生气,尤其是老板)。

I want to understand where we define these isolation levels: only at JDBC/hibernate level or in DB also

使用 JDBC,您可以使用 Connection#setTransactionIsolation 定义它.

使用 hibernate :

<property name="hibernate.connection.isolation">2</property>

在哪里

  • 1:读取未提交
  • 2:已提交阅读
  • 4:可重复读取
  • 8:可序列化

Hibernate 配置取自 here (抱歉,是西​​类牙语)。

顺便说一句,您也可以在 RDBMS 上设置隔离级别:

不断……

关于java - 事务隔离级别与表上的锁的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16162357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com