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

我读过关于4个隔离级别的文章:

隔离级别脏读不可重复读幻象读
允许读取未提交的
读取已提交–允许
可重复读取—-允许
可序列化—-

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

读取未提交-表上无锁
读取已提交-锁定已提交的数据
sql块上的可重复读取锁定(使用select查询选择)
SERIALIZABLE-锁定完整表(对其激发Select查询)

下面是事务隔离中可能出现的三种现象

脏读-无锁

不可重复读取-提交的数据上没有脏读取作为锁定

幻象读取-锁定sql块(使用select查询选择)

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

PS:我已经浏览了oracle中隔离级别的链接,但是它们看起来很笨拙,并且谈论特定于数据库的内容

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

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

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

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

使用JDBC,您可以使用连接#setTransactionIsolation定义它

使用Hibernate:

<property name=“hibernate.connection.isolation”>2</property>

在哪里

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

Hibernate配置取自此处(对不起,是西班牙语)

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

  • MySQL隔离级别
  • SQL Server隔离级别
  • Informix隔离级别(个人注意:我永远不会忘记将隔离设置为脏读语句。)

而且不停地

发表评论