2011-12-29 86 views
1

在Hibernate阻塞中写入特定操作吗?我的意思是,如果我执行:在Hibernate中阻止写入操作

session.save(data); 

从一个方法被标注为@事务,是保证每个

session.get(id); 

电话,从不同的线程来了,这条线后立即执行,会返回正确的数据(不为空)?

回答

1

您得到的结果取决于事务隔离级别。 Spring允许以下隔离级别:

DEFAULT 使用基础数据存储的默认隔离级别。

READ_COMMITTED 一个常量,指示防止脏读;不可重复读取和幻像读取可能发生。

READ_UNCOMMITTED 一个常量,指示可能发生脏读,不可重复读和幻读。

REPEATABLE_READ 一个常量,指示防止脏读和不可重复读取;幻像读取可能发生。

SERIALIZABLE 一个常量,指示可防止脏读,不可重复读取和幻读读取。

调用save()(或flush())不保证事务被提交。在调用get()之前提交事务(调用save()时)提交的情况下,您将始终在新线程中获取正确的结果。但是,如果事务未提交,您是否得到正确的结果取决于事务隔离级别。您将在允许“脏读”的隔离级别中得到正确的结果。

+0

我怎样才能确定发生这种情况?我应该尝试手动提交交易吗?或者,也许我可以设置一个标志,我将该方法声明为TRANSACTIONAL? – preslavrachev 2011-12-29 07:40:12

+0

为什么你想要这种行为?如果要确保发生这种情况,可以使用调用get()事务性的方法,隔离级别为READ_UNCOMMITTED。尽管如此,你可能会得到一些脏读。 – 2011-12-29 09:01:01

0

除非明确使用悲观锁定,否则写入操作不会被阻止。在一个事务中,发生的事情是未提交的对于这个事务之外的任何人都是不可见的(假设默认隔离级别为READ_COMMITTED)。正如你所提到的save()get()运行在不同的线程,因此不同的交易,这一切都取决于get()时是否提交save()的事实。