课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
事务是程序员在学习数据库架构技术的时候需要重点掌握的一个互联网知识点,下面我们就通过案例分析来了解一下,事务特性都包含哪些。
相信你之前一定在数据库中使用过事务,所以对原子性、一致性、隔离性和持久性这些事务的基本属性应该非常熟悉了。Clojure的STM对事务的支持与数据库有所不同,由于STM中的数据是全都放在内存而不是数据库或文件系统里的,所以STM只提供了事务的前三个属性,而缺少了对持久性的支持。
原子性:STM事务是原子的。即我们在一个事务中所做的变更要么对所有其他外部事务可见,要么完全不可见。更具体一些,就是一个事务中所有ref的变更要么都生效,要么都不生效。
一致性:是指事务应该要么执行完成并令外界看到其造成的变化,要么执行失败并使所有相关数据都保持原状。如果有多个事务同时运行,那么从这些事务之外的角度来进行观察,我们可以看到它们所造成的变化始终是一个接着一个发生的,中间不会有任何交叉。
隔离性:本事务无法看到其他事务的局部变更结果,即事务所造成的变更只能在其成功完成后才对外可见。
我们可以看到,这些属性都是侧重于数据的完整性和可见性的。其中,隔离性并不意味着事务之间就不能进行协调了。相反地,STM会密切监控所有事务的进展情况并努力使所有事务都能跑完(除非遇到由应用程序产生的异常)。
Clojure的STM采用了与数据库相似的多版本并发控制技术(MVCC),其并发控制也和数据库中的乐观锁(optimistic locking)很像。当我们启动一个事务的时候,STM会记录一下时间戳,并将事务中将会用到所有ref都拷贝一份。由于状态是不可变的,所以对于ref的拷贝是多快好省的。当对某个不可变状态进行“变更”的时候,我们其实并没有改变它的值(value),而是为其创建了一个含有新值的拷贝。该拷贝是本事务的一个内部状态,并且由于我们使用了持久化的数据结构,这一步也是多快好省的。而如果STM识别出我们操作过的ref已经被别的事务改了的话,它就会中止并重做本事务。当事务成功完成时,所有的变更都会被写入内存,而时间戳也将被更新。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。