我正在使用Spring 3,JPA + Hibernate爲CMS
應用程序。在那個應用程序中,我有一個服務類方法,它使用@Transactional
註釋與rollBack
屬性註釋。在該方法中,我使用循環將數據(即實體類)插入到表中。對於每個iteration
的循環實體類都必須保存到數據庫中。但它沒有發生。提交僅在循環的執行完成並退出該方法時發生。然後它立即提交併保存。但是在這種情況下,在提交數據之前,我需要讀取數據。我嘗試使用ISOLATION LEVEL
來讀取未提交的內容,但由於我使用的是默認的JPADialect
,因此它不受支持。還試圖添加休眠執行jpaDialect
但仍然沒有奏效。請幫助解決此問題的解決方法。還有一件事,有沒有使用傳播所需的方法。@Transactional Annotation +在循環中插入數據
回答
使用循環刪除該方法上的事務性註解。
在循環調用一個單獨的方法進行保存,使該方法事務
感謝您的回覆@NimChimpsky,但是我有一個類級別的Transactional Annotation,即使我從循環方法中刪除了Transactional annoation並將它賦予同一個類中的另一個方法。它不會工作,因爲類級註釋已經存在。有沒有什麼辦法可以在類級別指定Transactional註釋來忽略該類中定義的一些方法,即不用於考慮事務管理。 – Krishna 2012-03-15 14:29:16
只是刪除類級別的annoation並將其添加到您想要的每個方法 – NimChimpsky 2012-03-15 14:31:25
我試過了,但是當我運行該應用程序時,它會引發TransactionRequiedException說'沒有事務正在進行中'。我創建了兩個方法,一個方法的服務類中我寫了一些業務邏輯,第二個方法是我編寫代碼來創建實體類,並引用DAO類來保存這些實體類。對於第一種方法,我沒有給出任何註釋,但是對於第二種方法,我使用傳播需要新屬性來註釋事務性註解。執行從第一個方法開始。 – Krishna 2012-03-16 08:43:38
你是對的,這是什麼I
代表acid。由於事務處於孤立狀態,其他事務在提交之前無法看到它們。但玩隔離級別是一種不好的做法。我寧願建議你在一個單獨的事務中運行每一個迭代,並在裏面啓動和提交。
這是春天有點棘手,但這裏有一個例子:
public void batch() {
for(...) {
insert(...)
}
}
//necessarily in a different class!
@Transactional
public void insert() {
}
注意batch()
是不標註有@Transactional
和insert()
必須在不同的類(春季服務)。評論太長,但那就是生活。如果你不喜歡它,你可以手動使用TransactionTemplate
。
我想使用TransactionTemplate,來解決這個問題,但我對其他服務類使用聲明性事務方法。將使用TransactionTemplate的程序化事務與聲明性事務混合起來是不好的行爲。 – Krishna 2012-03-16 10:05:00
您也需要去與程序性交易(Spring的TransactionTemplate
或PlatformTransactionManager
是看班級,看到Spring Doc for programmatic transactions,或者你可以在你的循環中調用另一個事務方法,其中事務標記爲Propagation.REQUIRES_NEW
,這意味着每個方法的調用都在它自己的事務中執行,見here。我認爲第二種方法需要你在不同的Spring bean上定義REQUIRES_NEW方法因爲AOP-Proxy。如果循環未在事務中執行,您也可以省略REQUIRES_NEW。
- 1. 在循環中插入數據到mysql數據庫
- 2. 在循環中跳過數組插入
- 3. Spring MVC JdbcTemplate Transactional Annotation不起作用
- 4. 數據插入循環不起作用
- 5. 插入Access數據庫(循環)
- 6. 如何循環插入數據到codeigniter中的數據庫?
- 7. 如何使用for循環在postgresql中插入數據?
- 8. 用於在SQLite中插入數據值的同步循環
- 9. 節點Js Async for循環並在mongo中插入數據
- 10. C++ - 在地圖循環的地圖中插入數據
- 11. laravel將數據插入多行並在一個循環中
- 12. 使用javascript循環在mongodb中插入數據
- 13. 如何在循環數據庫中插入值
- 14. 如何在while循環中填充的數據庫中插入數據
- 15. 插入foreach循環
- 16. Oracle循環插入
- 17. pymongo插入循環
- 18. 插入數據到數據庫循環性能
- 19. 使用while循環插入數據到我的數據庫
- 20. 如何在數據庫中使用datagridview數據插入for循環
- 21. 在while循環中插入SQL語句
- 22. 在循環中插入查詢
- 23. 在循環中插入註釋模板
- 24. 在mysql中使用循環插入值
- 25. 在jdbc循環中插入多個
- 26. 在if循環中插入行
- 27. PHP - 在while循環中插入多行
- 28. 在foreach循環中插入隨機塊
- 29. 在Request + Cheerio(NODEJS)中循環插入
- 30. 循環插入在PHP中查詢
你似乎已經意識到你的問題是什麼。你剛剛把事務邊界放在了錯誤的地方。一旦你解決了這個問題,你應該會發現它可以按預期工作。 – 2012-03-15 14:00:27
您應該能夠在不提交或更改隔離級別的情況下讀取同一事務內的未被取消的數據。據我所知這是最常見的行爲.. – 2012-03-15 16:32:32