是否在Hibernate阻塞中编写特定的操作?我的意思是,如果我执行:
session.save(data);
从一个注释为@Transactional的方法,保证每个
session.get(id);
来自另一个线程的调用,在此行之后立即执行,将返回正确的数据(非空)?
答案 0 :(得分:1)
您获得的结果取决于事务隔离级别。 Spring允许以下隔离级别:
DEFAULT 使用基础数据存储的默认隔离级别。
READ_COMMITTED 一个常量,指示防止脏读;可以发生不可重复的读取和幻像读取。
READ_UNCOMMITTED 一个常量,表示可以进行脏读,不可重复读和幻像读。
REPEATABLE_READ 一个常量,表示禁止脏读和不可重复读;可以发生幻像读取。
SERIALIZABLE 一个常量,表示禁止读取脏读,不可重复读取和幻像读取。
调用save()(或flush())并不能保证事务已提交。如果您的事务(调用save()的位置)在调用get()之前提交,您将始终在新线程中获得正确的结果。但是,如果未提交事务,则是否获得正确的结果取决于事务隔离级别。您将在允许“脏读”的隔离级别中获得正确的结果。
答案 1 :(得分:0)
除非您明确使用悲观锁定,否则写入操作不会被阻止。在事务中,发生的事情是未提交的对于此事务之外的任何人都不可见(假设默认隔离级别为READ_COMMITTED)。正如您所提到的那样save()
和get()
在不同的线程中运行,因此在不同的事务中运行,这一切都取决于get()是否提交了save()这一事实。