在Hibernate阻塞中写入特定操作吗?我的意思是,如果我执行:在Hibernate中阻止写入操作
session.save(data);
从一个方法被标注为@事务,是保证每个
session.get(id);
电话,从不同的线程来了,这条线后立即执行,会返回正确的数据(不为空)?
在Hibernate阻塞中写入特定操作吗?我的意思是,如果我执行:在Hibernate中阻止写入操作
session.save(data);
从一个方法被标注为@事务,是保证每个
session.get(id);
电话,从不同的线程来了,这条线后立即执行,会返回正确的数据(不为空)?
您得到的结果取决于事务隔离级别。 Spring允许以下隔离级别:
DEFAULT 使用基础数据存储的默认隔离级别。
READ_COMMITTED 一个常量,指示防止脏读;不可重复读取和幻像读取可能发生。
READ_UNCOMMITTED 一个常量,指示可能发生脏读,不可重复读和幻读。
REPEATABLE_READ 一个常量,指示防止脏读和不可重复读取;幻像读取可能发生。
SERIALIZABLE 一个常量,指示可防止脏读,不可重复读取和幻读读取。
调用save()(或flush())不保证事务被提交。在调用get()之前提交事务(调用save()时)提交的情况下,您将始终在新线程中获取正确的结果。但是,如果事务未提交,您是否得到正确的结果取决于事务隔离级别。您将在允许“脏读”的隔离级别中得到正确的结果。
除非明确使用悲观锁定,否则写入操作不会被阻止。在一个事务中,发生的事情是未提交的对于这个事务之外的任何人都是不可见的(假设默认隔离级别为READ_COMMITTED)。正如你所提到的save()
和get()
运行在不同的线程,因此不同的交易,这一切都取决于get()时是否提交save()的事实。
我怎样才能确定发生这种情况?我应该尝试手动提交交易吗?或者,也许我可以设置一个标志,我将该方法声明为TRANSACTIONAL? – preslavrachev 2011-12-29 07:40:12
为什么你想要这种行为?如果要确保发生这种情况,可以使用调用get()事务性的方法,隔离级别为READ_UNCOMMITTED。尽管如此,你可能会得到一些脏读。 – 2011-12-29 09:01:01