标签归档:MySQL

浅析MySql Innodb引擎的加锁机制

MySQL数据库提供了好几种引擎,比如ISAM、MyISAM、HEAP、InnoDB和Berkley DB(BDB),比较常用的就是Innodb了。Innodb主要有以下几种锁,分别用在不同的场景里。

共享锁和排它锁(Shared and Exclusive Locks)
意图锁(Intention Locks)
记录锁(Record Locks)
区间锁(Gap Locks)
Next-Key Locks

共享锁和排它锁
首先需要指出的是这两种锁都是针对行(row)而言的,是innodb在行级锁(row-level locking)方面的两个实现。共享锁(shared (S) locks),每当读取一行记录时会加上一个共享锁。排它锁(exclusive (X) lock ),每当update或者delete一条记录时都会加上一个排它锁。当事务T1对某一行R拥有了一个读锁时,另一个事务T2对该条记录可以立即获得共享锁,但是不能获得排他锁。当事务T1对某一行R拥有了一个排他锁时,另一个事务T2无论是申请排他锁还是共享锁都需要等待T1释放锁。他们之间的关系如下表所示:[……]

继续阅读

RMDB中的事务隔离级别

网上关于这部分的介绍很多,这里写下自己对这几个隔离级别的理解。
首先解释下什么是隔离性(isolation):DB中的隔离性指的是一个操作产生的影响什么时候以哪种方式可以对其他并发操作可见。

然后再介绍几个容易混淆的概念:幻读,脏读和不可重复读
脏读(dirty reads)
某一个事务读取了另一个事务中已经修改了的但是尚未commit的数据,这就是脏读。一旦另一个事务发生回滚,则读取的值就是脏读了。
幻读(phantom reads):
A phantom read occurs when, in the course of a transaction, two identical queries are executed, and the collection of rows returned by the second query is different from the first.
在一个事务中,两个同样的查询语句得到的查询结果却不一样,这就是幻读,这里要注意一点:幻读是针对多条返回结果而言的
不可重复读(non-repeatable read)
A[……]

继续阅读

浅谈可重入性及其他

这篇文章主要讨论三个问题:1.什么是可重入性 2.什么是可重入锁 3.什么是ReentrantLock
首先为什么会讨论可重入性呢?大家知道java中有一个非常常用的类库叫ReentrantLock,中文翻译成可重入锁,每次看到这个翻译我的第一反应就是什么是可重入锁?为什么要这么命名呢?那么什么是ReentrantLock呢?Oracle的官方文档给出的解释是这样的:

A reentrant mutual exclusion Lock with the same basic behavior and semantics as the implicit monitor lock accessed using synchronized methods and statements, but with extended capabilities.

意思就是ReentrantLock和synchronized关键字所起的基本作用是一样的,但是提供了更多的扩展功能。看了这个解释并没有解答我的困惑,官方文档并没有解释什么是可重入锁,只是说了ReentrantLock提供了更多的功能。那么什么[……]

继续阅读