如何使用Squeryl設置事務隔離級別?在Squeryl中設置事務隔離級別
例如,現在我正在使用Postgresql,並且需要特定單個事務的可序列化隔離。我使用普通的Squeryl和Squeryl-Record和Lift web框架。
其他可能當然需要其他數據庫的整個會話(而不是單個事務)的其他隔離級別,所以一般的答案是可取的。
更新:
我結束了的戴夫·惠特克的代碼,這個修改後的版本:
def transactionWith[T](isolation: Int)(block: => T): T =
transaction {
val connection = Session.currentSession.connection
connection.rollback // isolation cannot be changed in the middle of a tx
connection.setTransactionIsolation(isolation)
block
}
的事情是,如果事務已經開始,你不能改變隔離水平。這是事實,我和無回退,我會得到:
org.postgresql.util.PSQLException: Cannot change transaction isolation level in the middle of a transaction.
只要我使用的交易{},而不是在inTransaction {}我覺得做一個即時回滾應該沒有壞處。
在事務{}提交或回滾之後,但在將連接返回到連接池之前,應該重置隔離級別。我不知道如何做到這一點。但在我的情況下,c3p0連接池似乎重置了隔離級別,並且每個事務都以默認隔離級別開始,即使我從不自己清理它們。
我不那麼滿意的事情是有衝突時的例外。我想特別注意這樣一個例外,然後重試交易。但它只是一個通用的運行時異常:
java.lang.RuntimeException: Exception while executing statement : ERROR: could not serialize access due to concurrent update
它包裝另一個異常不幸也是通用(org.postgresql.util.PSQLException)。
不完美,但它直到Squeryl希望獲得對事務隔離的支持。我在Squeryl 0.9.4上使用上面的代碼。
我還沒有機會嘗試這個呢。但它絕對看起來像要走的路。謝謝! –