2010-08-17 90 views

回答

8

如果你真的需要这一点,那么你想要做的事,如:

session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 

这等同于NOLOCK。

在你这样做之前,如果你想做一个肮脏的阅读,真的仔细考虑。大多数时候,人们这样做是因为这是他们一直以来所做的,而不是因为这是正确的事情。特别是,这不适用于缓存。

实际上,this thread进入了一些问题。在决定之前仔细阅读。

+0

谢谢,加里。 是的,我正在寻找脏读。我们的DBA在本项目区域推荐了所有“选择”的NOLOCK。问题在于,部分SQL处于休眠状态。 – Sarit 2010-08-17 13:09:53

+2

在最新版本的Hibernate中,connection()似乎从API中删除。关于如何在没有连接对象的情况下实现类似效果的任何想法? – 2012-09-25 05:05:11

+1

如果使用'@ Transactional'注释,它可以被指定为'isolation'属性。 – Tobb 2015-04-30 07:19:44

5

在Hibernate的最新版本,你需要做的是这样:

Session session = (Session) em.getDelegate(); 
     session.doWork(new Work() { 
      @Override 
      public void execute(Connection connection) throws SQLException { 
       connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 
      } 
     }); 
+0

我已经使用这种方法来设置某些查询的read_uncommitted事务隔离级别,但我确实知道连接数量比没有它的数量增加了多倍。在read_uncommitted事务之前,一个用户持有应用程序的Websphere服务器上的连接数量为4,之后变为80.这是否正常?或者我应该寻找别的什么地方找到这个问题? – CntkCtn 2017-05-16 09:03:28

2

可以做到“有(NOLOCK)”如果你去本地。这是极端的,但如果替代方案正在改变事务隔离级别,那么你可以这样做。

请注意,此示例适用于MSSQL。

String sqlQueryString = "SELECT * FROM my_classes_table WITH (nolock) WHERE columnName = :columnValue"; 

SQLQuery sqlQuery= session.createSQLQuery(sqlQueryString).addEntity(MyClass.class); 
sqlQuery.setLong("columnValue", value); 
List<MyClass> out = sqlQuery.list();