JPA中的数据库锁和隔离级别

时间:2015-07-22 11:51:53

标签: database jpa database-design transactions isolation-level

我不确定理解数据库锁。我正在使用repeatable read isolation level。根据维基百科,它保持读取和写入锁定(在选定数据上获取),直到交易结束。 让我们考虑以下场景:“让我们有两个线程A,B。线程A开始一个事务。让我们说线程A从表User中检索所有用户的列表。(我在这里期望:线程A获取读取和写入锁定所有用户??)线程B开始另一个事务,从表User检索一个具体的User u并更新User u然后提交事务(因为A获得了锁,线程B是否必须等到A提交事务?) “
如果使用JPA,是否会产生描述行为? 如果线程A读取事务外的用户(假设我使用的是扩展的持久性上下文),是否获取了锁?

1 个答案:

答案 0 :(得分:0)

您将逻辑隔离级别与其物理实现混淆。 SQL标准定义了四个隔离级别Serializable,Repeatable Read,Read Committed和Read Uncommitted以及可能违反可串行化的三种方式:脏读,不可重复读和幻读。

特定DBMS如何实现每个级别的隔离是每个DBMS之间不同的实现细节。某些DBMS可能使用锁定策略,这意味着使用读锁定意味着在事务完成之前阻止编写器。其他DBMS可能使用其他策略,例如多版本并发控制,这意味着读者和编写者不会相互阻塞。为了最大限度地提高应用程序的性能和可伸缩性,您需要对正在使用的DBMS的特定实现进行编码。