[关闭]
@lambeta 2016-07-30T15:11:58.000000Z 字数 2116 阅读 360

Transaction

concurrency

什么是事务


事务是一组不可分割的SQL query语句,或者说是一个最小的工作单元

事务与锁的关系


为什么提出这个问题

在阅读《Java虚拟机并发编程》(Programming Concurrency on the JVM - Materning Synchronization, STM and Actors)中STM(Software Transaction Memory)时,我看到transaction特征在concurrency中的神奇应用场景:

我看到了很多STM的好处,但是看到处理写偏斜异常(Handling Write Skew Anomaly)(可以简单理解为两个事务修改的变量不是同一个,但是两个变量之间又有约束关系)一章时,作者使用ensure函数给约束变量加了读锁。加读锁的意义在于本事务之外,其他事务无法获得该变量的写锁,自然无法修改它的值。但是这里显式地使用了锁,所以可以明确事务不是锁无关的,而且这让我联想到了数据库事务隔离级别中的可重复读(REPEATABLE_READ)。可重复读也是使用在特定记录行上使用读锁,来防止外部事务修改了该条记录行。

微妙的关系

有趣的事情来了,事务原子性能确保数据的完整性,而事务的一致性和隔离性则侧重于数据的可见性。可见性的保证在并发当中绝对和锁相关。我刚说了,事务给锁提供了抽象屏障,而且事务的隔离级别依旧仰仗锁的粒度,所以不要将事务看做银弹,以为有了事务,锁就不值一提。

数据库事务的隔离级别


为什么提出这个问题

一直被《高性能MySQL》里的解释弄得稀里糊涂,纠结于脏读、不可重复读和幻读之间的关系。而且某些解释看似合理,但完全没有指导价值。比如:阐述隔离级别,却没法从中得出我们如何结合应用场景选择合适的隔离级别。

隔离级别

STM的隔离级别


事务的级别


描述的是事务本身的属性
- readOnly:所有的操作都是读取操作,不涉及任何产生副作用的操作。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注