事务性内存起源于数据库理论,它为进程同步提供了另一种策略。
内存事务是原子的,是一系列内存读写操作。如果事务中的所有操作都已完成,则将提交内存事务。否则,必须中止操作并回滚。可以通过添加到编程语言中的功能来获得事务存储的便利性。考虑一个例子。假设我们有一个update()
修改共享数据的函数。传统上,此功能将使用互斥锁(或信号量)编写,如下所示:
void update (){ acquire(); /* modify shared data */ release(); }
但是,使用诸如互斥锁和信号灯之类的同步机制会涉及许多潜在的问题,包括死锁。另外,随着线程数量的增加,传统锁的伸缩性不太好,因为线程之间对锁所有权的争用程度变得很高。作为传统锁定方法的替代方法,可以将利用事务性内存的新功能添加到编程语言中。在我们的示例中,假设我们添加了atomic {S}构造,该构造确保S中的操作作为事务执行。这使我们可以update()
按以下方式重写函数−。
void update (){ atomic { /* modify shared data */ } }
使用这种机制而不是使用锁的优点在于,事务性内存系统(而不是开发人员)负责保证原子性。此外,由于不涉及任何锁,因此不可能发生死锁。此外,事务性存储系统可以标识原子块中的哪些语句可以并发执行,例如对共享变量的并发读取访问。当然,程序员可以识别这些情况并使用读写器锁,但是随着应用程序中线程数量的增加,任务变得越来越困难。事务性存储器可以用软件或硬件来实现。软件事务存储器(STM),该事务专用于软件中实现事务存储器-不需要特殊的硬件。它通过在事务块内插入检测代码来工作。该代码由编译器插入,并通过检查语句可以在何处并行运行以及在何处需要特定的低级锁定来管理每个事务。硬件事务性内存(HTM)使用硬件缓存层次结构和缓存一致性协议来管理和解决涉及驻留在单独处理器缓存中的共享数据的冲突。它不需要特殊的代码工具,因此比STM具有更少的开销。但是,HTM确实要求修改现有的缓存层次结构和缓存一致性协议以支持事务性内存。事务性内存已经存在了数年,没有得到广泛实施。然而,
问题内容: 关于Spring JPA存储库事务性的1个快速问题。我有未标记为事务性的服务,并调用了Spring JPA存储库方法 它被定义为 问题是它失败,并且“ 没有EntityManager,当前线程没有可用的实际事务- 无法可靠地处理’remove’调用;嵌套异常是javax.persistence.TransactionRequiredException “异常。 好的,我可以通过将服务
本文向大家介绍MSSQL事务的存储过程,包括了MSSQL事务的存储过程的使用技巧和注意事项,需要的朋友参考一下 在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示: 房型表:RoomType 房间表:Room 首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rType
关于Spring JPA存储库事务性的1个快速问题。我有一个未标记为事务性的服务,并调用Spring JPA存储库方法 好的,我可以通过标记服务或deleteByEmail(..)来解决它方法作为事务性的,但我就是不明白为什么它现在会崩溃。Spring文档明确指出“存储库实例上的CRUD方法在默认情况下是事务性的。”(http://docs.spring.io/spring-data/jpa/do
下述存储引擎支持事务: ·InnoDB:通过MVCC支持事务,允许COMMIT、ROLLBACK和保存点。 ·NDB:通过MVCC支持事务,允许COMMIT和ROLLBACK。 ·BDB:支持事务,允许COMMIT和ROLLBACK。
问题内容: 我的存储过程的基本结构是 MySQL版本: 5.1.61-0ubuntu0.11.10.1-log 当前,如果“查询2”失败,则提交“查询1”的结果。 如果任何查询失败,如何回滚事务? 问题答案: 看看http://dev.mysql.com/doc/refman/5.0/en/declare- handler.html 基本上,您声明错误处理程序,它将调用回滚
我有一个用例,我需要从一个Kafka主题中消费,做一些工作,生成另一个只有一次语义的Kafka主题,并保存到mongo数据库。看完文档后,我想kafka事务和mongo事务可以同步,但它们仍然是两个不同的事务。在下面的场景中,如果mongo提交失败,是否有方法回滚提交到主题并从消费者处重播的kafka记录。