Tag: transactions

延迟发送邮件直到事务提交

有没有人有一个很好的教程或一些关于如何实现自己的XAResource的建议? 我需要Spring的MailSender是事务性的,因此只有在事务提交后才会发送邮件,而且似乎没有任何现有的事务包装器。

Spring应用程序似乎不是持久化数据

我正在尝试将一些内容写入我的数据库,但尽管它报告了“成功完成请求”,但它仍无法正常工作。 成功之后,一切似乎都运行良好,我的控制器正确地重定向我。 调试 DEBUG adppayment.PaymentServiceImpl – Requesting to persist new user’max_test@test.com’. DEBUG adppayment.model.PaymentDAOImpl – Persisting com.app.payment.model.PaymentUser@86ceb985. DEBUG osojSharedEntityManagerCreator$SharedEntityManagerInvocationHandler – Creating new EntityManager for shared EntityManager invocation DEBUG org.hibernate.impl.SessionImpl – opened session at timestamp: 13771737739 DEBUG ohedef.AbstractSaveEventListener – delaying identity-insert due to no transaction in progress DEBUG osojpa.EntityManagerFactoryUtils – Closing JPA EntityManager DEBUG osbfsDefaultListableBeanFactory – Invoking […]

Spring-JDBC中的隔离级别SERIALIZABLE

也许有人可以帮我解决Spring(3.1)/ Postgresql(8.4.11)中的事务问题 我的交易服务如下: @Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false) @Override public Foo insertObject(Bar bar) { // these methods are just examples int x = firstDao.getMaxNumberOfAllowedObjects(bar) int y = secondDao.getNumerOfExistingObjects(bar) // comparison if (x – y > 0){ secondDao.insertNewObject(…) } …. } Spring配置Webapp包含: @Configuration @EnableTransactionManagement public class ….{ @Bean public DataSource dataSource() { org.apache.tomcat.jdbc.pool.DataSource ds = […]

Spring MVC Controller Transactional

我试图获得一个Spring @ MVC Controller方法,该方法已经注释了@Transactional如果在方法返回之前在客户端上拉网络电缆就会回滚,我似乎无法让它工作,这是一个例子我正在努力实现的目标。 @Transactional(rollbackFor = IOException.class) @RequestMapping(value = “/test”) public @ResponseBody Integer testMethod(HttpServletResponse response) throws Exception { LOG.debug(“Put breakpoint here, and pull network cable on client…”); //IMHO this should throw an IOException, but it isn’t doing? response.getOutputStream(); return 10; } 因此,如果我在日志记录语句中放置一个断点,然后拔掉客户端上的网络电缆然后播放,我希望从response.getOutputStream()获得IOException,但事实并非如此,任何帮助将不胜感激?

事务暂停如何在Spring中运行?

我的问题和这里的问题基本相同,但我对答案不满意所以我正在写这个问题。 在Spring Framework手册中,声明对于PROPAGATION_REQUIRES_NEW,当前事务将被暂停。 这是如何实际实现的? 我知道大多数数据库不支持嵌套事务,并且只能在一个连接中运行一个事务。 这意味着您不能只是“不使用”原始事务并启动新事务 – 在启动新事务之前,您必须提交或回滚原始事务。 例: START TRANSACTION SELECT … UPDATE … — Now we run method with PROPAGATION_REQUIRES_NEW — How do we “suspend” transaction so we can start new one? START TRANSACTION UPDATE … COMMIT — We returned from the method, result was commited — Now we’d like to “unsuspend” the […]

带有Spring的EJB3

我已经明白,如果我在Spring上下文中使用EJB,我会得到所有相同的好处,就像我在“纯”EJB3环境中使用它一样,这是真的吗? 我用谷歌搜索,但找不到明确,明确的答案。 例如,假设我有一个会话bean来更新数据库中的某些表,并引发系统exception。 在“纯”EJB3环境中,事务将回滚。 如果我使用Spring @Autowire这个bean,那么Spring会像EJB3容器一样处理事务处理吗? 或者是什么? 它可能需要一些特定的配置还是完全“自动”?

如何在DDD中管理域逻辑和事件之间的事务?

我正在研究DDD和事件源中的编程。 我看到一个例子,当一个域逻辑被调用时(例如Order.placeOrder() ),它会发布一个事件(例如OrderPlaced )。 事件将作为事件存储发送到MQ。 域逻辑( Order.placeOrder() )应该是一个primefacesAPI,如果使用Spring作为事务管理器,它应该有@Transactional注释。 现在我的问题是: 如何确保数据库更改和事件发送在同一个事务中? 即如果在将数据提交到DB时出现任何错误,则该事件永远不应发送给MQ。 我知道有像XA或2阶段提交这样的解决方案来强制数据库更新并在同一事务中发送MQ消息。 但似乎现在还没有广泛使用。 如果仍然使用Spring @Transactional注释而没有XA,那么在事务成功提交后我们可能会做一些逻辑吗? 这样做的最佳做法是什么?

强制事务回滚Seam中的validation错误

快速版本:我们正在寻找一种方法来强制事务在特定情况下在支持bean上执行方法时发生回滚,但是我们希望在不向用户显示通用500错误页面的情况下进行回滚。 相反,我们希望用户看到她刚刚提交的表单和一个表明问题所在的FacesMessage。 长版本:我们有一些支持bean,它们使用组件在数据库中执行一些相关的操作(使用JPA / Hibernate)。 在此过程中,某些数据库操作发生后可能会发生错误。 这可能是出于几个不同的原因,但对于这个问题,让我们假设在发生一些DB写入之后检测到的validation错误在写入发生之前是不可检测的。 发生这种情况时,我们希望确保到目前为止所有的数据库更改都将被回滚。 Seam可以解决这个问题,因为如果你从当前的FacesRequest中抛出一个RuntimeException,Seam将回滚当前的事务。 这样做的问题是用户显示了一般错误页面。 在我们的例子中,我们实际上希望用户能够显示她所在的页面,并提供有关出错的描述性消息,并有机会纠正导致问题的错误输入。 我们提出的解决方案是从发现带有注释的validation问题的组件中抛出exception: @ApplicationException( rollback = true ) 然后我们的支持bean可以捕获此exception,假设抛出它的组件已发布相应的FacesMessage,并且只需返回null以将用户带回输入页面并显示错误。 ApplicationException注释告诉Seam回滚事务,我们没有向用户显示一般错误页面。 这在我们使用它的第一个地方运作良好,恰好只是插入。 我们尝试使用它的第二个地方,我们必须在此过程中删除一些东西。 在第二种情况下,如果没有validation错误,一切正常。 如果确实发生了validation错误,则抛出回滚exception并将事务标记为回滚。 即使没有发生回滚数据库修改,当用户修复错误数据并重新提交页面时,我们得到: java.lang.IllegalArgumentException: Removing a detached instance 分离的实例从另一个对象延迟加载(存在多对一关系)。 在实例化辅助bean时加载该父对象。 由于事务在validation错误后回滚,因此该对象现在已分离。 我们的下一步是将此页面从会话范围更改为页面范围。 当我们这样做时,Seam甚至无法在validation错误之后呈现页面,因为我们的页面必须命中数据库才能呈现并且事务已标记为回滚。 所以我的问题是:其他人如何干净利落地处理错误并同时正确管理交易? 更好的是,我希望能够使用我们现在拥有的所有东西,如果有人能够发现我做错的东西,而且相对容易修复。 我已经阅读了有关统一错误页面和exception处理的Seam Framework文章,但这更倾向于应用程序可能遇到的更一般的错误。 更新 :这里有一些psudo代码和页面流的详细信息。 在这种情况下,假设我们正在编辑一些用户的信息(在这种情况下我们实际上并没有处理用户,但我不打算发布实际的代码)。 编辑function的edit.page.xml文件包含RESTful URL的简单重写模式和两个导航规则: 如果结果成功编辑,则将用户重定向到相应的视图页面以查看更新的信息。 如果用户点击取消按钮,则将用户重定向到相应的视图页面。 edit.xhtml非常基本,可以编辑用户的所有部分的字段。 辅助bean具有以下注释: @Name( “editUser” ) @Scope( ScopeType.PAGE ) 有一些注入的组件,如用户: @In […]

JOOQ和交易

我一直在阅读有关交易和jooq的内容,但我很难看到如何在实践中实现它。 假设我使用自定义ConnectionProvider提供JOOQ,它恰好使用自动提交设置为false的连接池。 实施大致如下: @Override public Connection acquire() throws DataAccessException { return pool.getConnection(); } @Override public void release(Connection connection) throws DataAccessException { connection.commit(); connection.close(); } 我如何将两个jooq查询包装到单个事务中? 使用DefaultConnectionProvider很容易,因为只有一个连接 – 但是对于一个池我不知道如何去做。

没有@Transactional注释的Spring托管事务

我正在使用Spring注释来管理我的交易,如下所示: @Transactional(readOnly = true) public class AlertServiceImpl implements AlertService { private AlertDAO alertDAO; public List getAlerts(){ List alerts = alertDAO.getAlerts(); return alerts; } } 我想知道如果忘记注释会发生什么: // Oops! Forgot to use transactional annotation public class AlertServiceImpl implements AlertService { private AlertDAO alertDAO; public List getAlerts(){ List alerts = alertDAO.getAlerts(); return alerts; } } 当alertDAO实现如下: import org.springframework.orm.hibernate3.support.HibernateDaoSupport; […]