`

Hibernate之事务、隔离级别、悲观锁、乐观锁

 
阅读更多

事务需要保证原子性(Atomicity)、一致性(Consistence)、隔离性(Isolation behavior)、持续性(Durability),简称ACID。

原子性:一个事务内的操作要么全部成功,要么全部失败回滚。

一致性:事务内的数据,如果事务成功,则必须都是成功后的状态,如果失败,则必须都是最开始的状态,不能有的是成功后的状态,有的是开始的状态。

隔离性:在多个事务同时进行的情况下,互相不能干扰。

持续性:事务一旦成功,则事务成功的结果必须保存下来。

事务可以由声明式事务和编程式事务,声明式的事务由容器所提供的服务,可以在配置文件中定义事务边界、隔离级别等。

编程式事务是直接使用JDBC或者相关框架的API,以编写代码的方式,可以更细致的定义事务边界、隔离级别等。

下面重点介绍下事务的隔离性怎么保证。

在数据库中保证隔离性最基本的方式就是锁定数据库,或者被更新、读取的表、列,如果数据库不锁定数据会发生的事:

1.lost update

事务A更新某条数据

事务B更新某条数据

事务B commit

事务A commit

事务A的更新就丢失了。

2.dirty read

 

事务A更新某条数据

事务B读取该条数据

事务A commit

事务B commit

这种情况下事务B读的就是脏数据。

3.unrepeatable read

事务A读取某条数据

事务B更新了数据

事务B commit

事务A再次读取数据

这时A两次读取的结果就不一样

4.phantom read

事务A查询到了5条数据

事务B更新了相关联的表

事务B commit

事务A再次查询只得到了4条数据

这次事务A就是幻读了

为了解决上面的4种问题,就出现了4种隔离级别,不同的数据库默认使用不同的隔离级别

1.read uncommit

当事务A更新某条数据时,不容许其他事务来更新该数据,但可以读取。

2.read commit

当事务A更新某条数据时,不容许其他事务进行任何操作包括读取,但事务A读取时,其他事务可以进行读取、更新

3.read repeatable

当事务A更新数据时,不容许其他事务进行任何操作,但当事务A进行读取时,其他事务只能读取,不能更新。

4.serializable

最严格的隔离级别,事务必须依次进行。

Hibernate乐观锁策略,认为很少出现同时读取、更新的情况,在数据库隔离级别一般设为read commit,会导致出现lost update的问题

对于lost update问题,有3种解决策略:

先更新为主:两个事务同时更新,但后提交的事务将抛出exception,后面的事务必须重新获取数据

后更新为主:后提交的事务直接覆盖先提交的。

合并冲突:后提交的数据会得到提示,只更新没有冲突的列

Hibernate推荐我们使用先更新为主,是通过version来实现的,即读取数据的时候会得到一个version值,提交时会将这个version值和数据库中的相比,如果一样则证明可以成功提交,并同时将version+1。

实现version可以在对象模型中加一个version属性,并在关系模型加一个version列,也可以配置让hibernate通过比较对象所有的属性来确实是否是可以更新。

Hibernate悲观锁策略,认为会经常出现同时读取、更新的情况;

List users1 = query.list();
query.setLockMode("user", LockMode.UPGRADE);

hibernate通过锁定数据来避免lost update的问题。

在Hibernate配置文件中设置隔离级别:

JDBC连接数据库使用的是默认隔离级别,即读操作已提交(Read Committed)和可重读(Repeatable Read)。在Hibernate的配置文件hibernate.properties中,可以修改隔离级别:

1:读操作未提交(Read Uncommitted) 2:读操作已提交(Read Committed) 4:可重读(Repeatable Read) 8:可串行化(Serializable)

<property name=” hibernate.connection.isolation”>4</property>

 

Oracle 数据隔离级别设置

 

Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED;

设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

分享到:
评论

相关推荐

    数据库事务、hibernate悲观锁和乐观锁

    在处理并发问题时,Hibernate提供了悲观锁和乐观锁两种机制。 悲观锁假设并发环境中的冲突是常态,因此在读取数据时就立即锁定,直到事务结束才释放。在Hibernate中,可以通过设置`@LockModeType.PESSIMISTIC_READ`...

    Hibernate乐观锁和悲观锁分析

    【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...

    Hibernate悲观锁与乐观锁案例

    在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...

    Hibernate实现悲观锁和乐观锁代码介绍

    Hibernate 的隔离机制是基于数据库的事务隔离级别的。 Hibernate 提供了四种隔离机制: 1. Read Uncommitted:能够读取未提交的数据,允许脏读的存在。 2. Read Committed:不会出现脏读,因为只有另一个事务提交才...

    Hibernate 事务和并发控制

    例如,对于读多写少的场景,乐观锁和较高的事务隔离级别(如Repeatable Read)可能是更好的选择。而对于写操作频繁的情况,悲观锁和更低的隔离级别可能更合适。 总的来说,理解并熟练掌握Hibernate的事务和并发控制...

    Hibernate4实战 之第五部分:Hibernate的事务和并发

    这意味着,当你的应用程序与数据库进行交互时,其行为遵循数据库定义的事务隔离级别,而真正的事务支持取决于底层数据库的实现。 #### 三、事务并发处理 Hibernate 提供了两种主要的并发控制机制: 1. **乐观锁...

    hibernate 对事务并发处理

    在 Hibernate 中,可以通过设置 hibernate.connection.isolation 属性来指定事务隔离级别。 例如: ```xml &lt;property name="hibernate.connection.isolation"&gt;2 ``` 这将设置事务隔离级别为 READ_COMMITTED。 解决...

    hibernate事务,并发及缓存管理实例

    Hibernate提供了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。开发者可以根据应用场景选择合适的隔离级别。此外,...

    Hibernate教程26_事务并发处理

    同时,还要注意合理配置事务隔离级别,如读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE),以平衡数据一致性与性能。 总之,深入学习和掌握...

    hibernate5--2.数据持久化及事务

    - **悲观锁**:在读取数据时就锁定资源,防止其他事务修改,直至事务结束释放锁。Hibernate通过`@Lock`注解配合`LockModeType`实现悲观锁。 **5. 事务的回滚规则** - 任何未捕获的`HibernateException`或`JDBC...

    hibernate锁实验,以及解决方案

    1. **悲观锁与乐观锁** - 悲观锁:在读取数据时就假设会发生并发冲突,因此在读取时会立即加锁,防止其他事务修改数据。在Hibernate中,悲观锁主要通过`LockMode.UPGRADE`实现,即使用`SELECT ... FOR UPDATE`语句...

    Hibernate中,利用版本管理机制来控制事务并发

    2. 事务隔离级别:Hibernate的版本管理机制与数据库的事务隔离级别相结合,可以实现不同级别的并发控制。例如,在可重复读(Repeatable Read)隔离级别下,虽然能防止脏读,但可能会出现幻读,此时版本管理机制可以...

    hibernate的事务核并发

    同时,Hibernate还支持乐观锁和悲观锁机制,通过版本字段或锁定表行的方式,防止并发修改冲突。 ### 使用ThreadLocal和getCurrentSession() 在多线程环境中,如Web应用或EJB容器,为了保证`Session`的线程安全和...

    jee事务控制.pdf

    ### J2EE事务控制详解 ...通过选择合适的事务隔离级别,并结合乐观锁或悲观锁等策略,可以有效提高系统的并发性能和数据一致性。在实际应用中,开发者应根据业务需求和性能要求灵活选择最佳方案。

    hibernate的事务和并发资料.pdf

    它不锁定内存中的对象,而是通过数据库的乐观锁策略(如版本字段)来确保数据的一致性。 关于Session和事务范围,一个SessionFactory是线程安全的,建议在应用程序启动时创建并全局共享。相反,Session是轻量级且非...

    hibernate事务管理

    Hibernate支持四种标准的事务隔离级别,它们分别是READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。不同的隔离级别会影响并发控制和脏读、不可重复读、幻读等问题。在Spring中,可以通过@...

    学习J2EE事务并发控制策略总结.pdf

    它提到了几种常见的并发控制策略,包括乐观锁和悲观锁,以及如何在不同数据库事务隔离级别下应用这些策略。 首先,数据库事务隔离级别是决定并发控制的基础。根据ANSI标准,有四个不同的隔离级别: 1. 读取未提交...

Global site tag (gtag.js) - Google Analytics