jjzjj

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

coder 2023-04-27 原文

我已经阅读了大约 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/

有关java - 事务隔离级别与表上的锁的关系的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  5. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  6. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  7. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  10. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

随机推荐