Цитата(ivg @ 21.8.2008, 18:48 ) | | Какую транзакцию? Строки 35, 43, 48, 51, 55, 58 последнего листинга (класс UserManager)? Не? Не то? Тогда что? |
Тем кто читал сериал я думаю будет более или менее понятно о чем речь. А для тех кто не читал попытаюсь объяснить.
Допустим на страничке мы пытаемся изменить данные юзера, делаем запрос. В классе UserController обрабатываем этот запрос
| Код | public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { UserManager userManager = (UserManager) com.jetscart.core.Controller.getInstance().getRegistry().getManager(UserManager.BEAN_NAME); UserEntity user = new UserEntity(); //... что-то делаем System.out.println("insert user"); userManager.update(user); return new ModelAndView(); }
|
В классе UserManager обновляем в базе
| Код | public ResultStatus update(UserEntity user) { entityManager.getTransaction().begin(); entityManager.flush(); entityManager.refresh(user); entityManager.getTransaction().commit(); return ResultStatus.newOkResult(); }
|
Если приходит только один запрос, то все нормально, но когда одну запись о юзере пытаются поменять сразу двое (и более), возникает проблема... И начинают сыпаться разного рода ошибки например
| Код | 21.08.2008 19:46:10 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet test threw exception java.lang.IllegalStateException: Transaction already active at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:35) at com.jetscart.user.UserManager.update(UserManager.java:55) at com.jetscart.user.UserController.handleRequest(UserController.java:25) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
|
Вот и вопрос где, как, когда открывать транзакции, делать commit и т.д.
P.S. http://forum.vingrad.ru/forum/topic-204182.html мне посоветовали почитать книгу http://depositfiles.com/ru/files/2729004. Там по-моему глава есть про Web приложения. |