Tag: 事务

为什么在Hibernate中不建议使用“hibernate.connection.autocommit = true”?

在Hibernate API中,有一个属性hibernate.connection.autocommit ,可以设置为true。 但是在API中,他们提到不建议像这样设置它: 为JDBC池连接启用自动提交(不建议这样做)。 为什么不推荐? 将此属性设置为true会产生什么不良影响?

Java中的XA事务文件访问是否有开源解决方案?

是否可以在Java中对文件系统进行XA事务访问? 我想在事务的边界内操作文件,我的事务必须通过JTA参与分布式事务(所以我想文件系统需要作为XAResource访问)。 我不需要支持细粒度的读/写文件访问; 将每个文件视为记录对我的需求是足够好的。 有人知道一个已经这样做的开源项目吗? 我不想实现这个烂摊子只是为了发现它已经完成了…… 我听到一些传言说JBoss Transcations会增加对此的支持(参见例如此讨论 ),但未能找到关于此的正式声明。 顺便说一句,如果您需要事务性文件访问但不要求事务参与两阶段提交,我建议您查看Apache Commons Transaction 有关复杂性的好文章可以在这里找到。

Propagation.REQUIRES_NEW不会在Spring中使用JPA创建新事务

我有以下情况。 我正在使用JPA,Spring: @Autowired SampleService service; @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void PerformLogic(LogicData data) throws SIASFaultMessage { SampleObject so = createSampleObject(); try{ .//do some logic to persist things in data . . persistData(data); . . . updateSampleObject(so); } catch(Exception){ updateSampleObject(so); throw new SIASFaultMessage(); } } @Transactional(propagation = Propagation.REQUIRES_NEW) public createSampleObject() { SampleObject so = […]

分布式事务和/或群集中共享数据的Java解决方案

集群/分发Java服务器应用程序的最佳方法是什么? 我正在寻找一种方法,允许您通过添加更多的应用程序服务器和更多的数据库服务器来横向扩展。 您会建议采用哪些技术(软件工程技术或特定技术)来解决此类问题? 您使用哪些技术来设计持久层以扩展到许多读取器/写入器扩展应用程序事务并扩展对共享数据的访问(最佳方法是消除共享数据;可以应用哪些技术来消除共享数据)。 似乎需要使用不同的方法,具体取决于您的事务是读取还是写入繁重,但我觉得如果您可以优化“写入”繁重的应用程序,这对于“读取”也是有效的 “最佳”解决方案允许您为单个节点编写Java应用程序,并希望“隐藏”访问/锁定共享数据的大部分细节。 在分布式环境中,最困难的问题总是归结为多个事务访问共享数据。 似乎有两种常见的并发事务方法。 显式锁 (在分布式系统中的多个节点之间极易出错并且协调速度很慢) 软件事务内存 (STM)AKA乐观并发,如果事务发现共享状态已更改(并且稍后可以重试事务),则在提交期间回滚事务。 哪种方法可以更好地扩展,在分布式系统中有哪些权衡取舍? 我一直在研究扩展解决方案(以及提供如何扩展的示例的一般应用程序),例如: Terracotta – 通过使用Java的并发锁定机制(synchronized,ReentrantReadWriteLocks)扩展Java内存模型以包含分布式共享内存,提供“透明”扩展。 Google App Engine Java – 允许您编写Java(或python)应用程序,这些应用程序将分布在“云”服务器中,您可以在其中分发服务器处理事务,并使用BigTable存储持久数据(不确定访问共享的事务的方式)数据或处理锁定争用,以便能够有效扩展) Darkstar MMO服务器 – Darkstar是Sun的开源MMO(大型多人在线)游戏服务器,它们以线程事务方式扩展事务,允许给定事务仅运行一定量并提交,如果需要很长时间,它将回滚(有点像软件事务内存)。 他们一直在研究支持多节点服务器设置以进行扩展。 Hibernate的乐观锁定 – 如果你使用的是Hibernate,你可以使用它们的乐观并发支持来支持软件事务内存类型的行为 Apache CouchDB应该自然地以网状配置“扩展”到许多读写器DB。 (有一个很好的例子,说明如何管理锁定数据或确保事务隔离?): JCache – 通过将结果缓存到您可以在Google appengine中使用的常见查询来扩展“读取”繁重的应用程序,以访问memcached并缓存其他经常读取的数据。 Terracotta似乎是最完整的解决方案,因为您可以“轻松”修改现有服务器应用程序以支持扩展(在定义@Root对象和@AutLockRead / Write方法之后)。 问题是真正从分布式应用程序中获得最大的性能,分布式系统的优化实际上并不是真的,你必须设计它,知道对象访问可能被网络I / O阻止。 为了正确扩展,似乎总是归结为分区数据和负载平衡事务,例如给定的“执行单元”(cpu core – > thread – >分布式应用程序节点 – > DB主节点) 似乎通过群集使任何应用程序正确扩展,您需要能够根据其数据访问读/写对事务进行分区。 […]

外行人的术语中的春季传播例子

Spring文档在描述事务传播属性方面做得非常出色。 但是,我想知道是否有任何众所周知的现实世界的例子可以用外行的话来更全面地描述这些属性?

在@Configuration类中设置Spring中的注释驱动事务

因此,在最新版本的Spring中,我们可以使用@Configuration注释来设置Spring的配置。 现在,在JavaConfig中,可以使用@AnnotationDrivenTx ( @AnnotationDrivenTx Reference Link)批注在Config类中设置事务。 但是由于JavaConfig已经退役,我想知道是否有人知道如何在没有JavaConfig的情况下设置类似的东西,而无需向application-context.xml添加任何内容。 这是我基本上用于Config类的内容 @Configuration @ImportResource(“config/application-context.xml”) public class Config { public @Bean DataSource dataSource() { //get and return datasource } public @Bean Service1 getService1() { //return service1Impl } } 我想使Service1交易。 如果有人对如何做到这一点有任何想法,或者如果这是不可能的,请告诉我。 谢谢!

指定@Transactional rollbackFor还包括RuntimeException

@Transactional(rollbackFor = MyCheckedException.class) public void foo() { throw new RuntimeException(); } 这个事务会被回滚,还是我还需要在注释中包含RuntimeException.class?

导致召回Firebase Android的交易活动

当我点击我的rate_btn来启动此交易function时。 它工作正常,但在此过程中它再次重新运行我的类活动(每次使用事务时我的类活动重新运行)因此重置像我的msg_ID这样的所有内容。 例如,每次调用此类活动时,我的msg_ID都会更改(由于使用随机),因此当我运行事务时它会起作用,但作为回报,它还运行了类活动,因此也改变了我的msg_ID 。 这是一个场景: 因此,当点击这个“速率”按钮时,它会对当前的msg_ID进行评级,但是当我再次点击它时,由于我获得了随机的msg_ID ,它会对不同的msg_ID进行评级 。 我认为这是在我调用onComplete方法时引起的。 当我点击rate_btn 现在class级重新运行,我再次点击rate_btn 。 它对第一个msg_id进行了投票,然后当我再次点击rate_btn时它会对第二个键进行投票(因为它重新调用了类活动并且msg_id已更改) 这是交易代码: rate_btn.setOnClickListener(new OnClickListener(){ public void onClick(View v){ Firebase upvoteref = new Firebase(“https://myapp.firebaseio.com/”+msgID+”/upvotes”); upvoteref.runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(final MutableData currentData) { if (currentData.getValue() == null) { currentData.setValue(1); } else { currentData.setValue((Long) currentData.getValue() + 1); } return Transaction.success(currentData); } public void onComplete(FirebaseError […]

Hibernate拦截器和事件监听器

我想知道是否有可能找出hibernate对数据库的真正作用 (即提交的更改)。 我想就某些变化通知另一个流程。 我想EventType的POST_COMMIT_DELETE , POST_COMMIT_UPDATE和POST_COMMIT_INSERT应该这样做,但是只给出零文档,这只是猜测。 有人可以证实吗? 我错过了吗? 我也不确定如何获得真正的书面内容。 PostInsertEvent包含Object entity和Object[] state ,我应该信任哪两个? 一个附带问题:我没有使用XML,没有Spring,没有JPA,只有Configuration和buildSessionFactory 。 这真的是听众应该注册的方式吗? EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory) .getServiceRegistry() .getService(EventListenerRegistry.class); registry.appendListeners(….); 我要求它作为它的1.依赖于实现细节,2完全丑陋,3几乎完全不可发现。

spring悲观锁定

我有java下的spring项目,使用hibernate查询,我喜欢使用悲观锁定。 如何在Spring + Hibernate中进行悲观锁定? 编辑: @Loggable(value = LogLevel.TRACE) @Transactional @Override public void updateBalance(String id, BigDecimal amount) { Session session = sessionFactory.getCurrentSession(); sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.flush(); Account acc = (Account) session.get(Account.class, id, LockMode.UPGRADE); acc.setName(“New Account”); acc.setBalance(acc.getBalance().subtract(amount)); save(acc); try{ tx.commit(); }catch (TransactionException e){ tx.rollback(); } session.close(); } 问题: 我想在方法中使用悲观锁定,并且我从不同的方法中调用此方法。 当我从第一种方法调用它时,悲观的工作正常,但当我从第二种方法调用它时,它给出了(事务无法提交) 例外: Could not commit Hibernate […]