ACID
事务的概念源自于数据库管理系统(DBMS)中数据库事务的概念。
在数据库管理系统中,事务必须满足ACID性质,即原子性,一致性,隔离性和持久性。
原子性
原子性指的是事务中的动作要么全部执行,要么一个都不执行;
一致性
一致性指的是任何时刻,数据库必须处于一致性状态,即必须满足某些预先设定的条件;
隔离性
隔离性是指一个事务不能看见其他未提交事务所涉及到的内部对象的状态;
持久性
持久性则是指一个已提交的事务对数据库系统的改变必须是永久的。
STM中的事务
由于STM中的数据是全都放在内存而不是数据库或文件系统里的,所以STM只提供了事务的前三个属性,而缺少了对持久性的支持。
通过将对内存的访问封装在事务(transactions)中,STM消除了多线程内存同步过程中我们易犯的那些错误!
在Clojure语言中,STM实现采用了与数据库相似的多版本并发控制技术(MVCC),其并发控制也和数据库中的乐观锁(optimistic locking)很像。
当我们启动一个事务的时候,STM会记录一下时间戳,并将事务中将会用到所有ref都拷贝一份。
由于状态是不可变的,所以对于ref的拷贝是多快好省的。
当对某个不可变状态进行“变更”的时候,我们其实并没有改变它的值(value),而是为其创建了一个含有新值的拷贝。该拷贝是本事务的一个内部状态,并且由于我们使用了持久化的数据结构,这一步也是多快好省的。
而如果STM识别出我们操作过的ref已经被别的事务改了的话,它就会中止并重做本事务。当事务成功完成时,所有的变更都会被写入内存,而时间戳也将被更新!
https://www.cnblogs.com/bonelee/p/6056311.html