Mysql的事物级别

Source

关于事物级别的定义


1.read uncommitted (未提交读)


可以看到未提交的数据(脏读),举个例子:别人说的话你都相信了,但是可能他只是说说,并不实际做。


2.read committed (提交读)


读取提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。用读写的观点就是:读取的行数据,可以写。


3.repeatable read(重复读MySQL默认隔离级别)


可以重复读取,但有幻读。读写观点:读取的数据行不可写,但是可以往表中新增数据。在MySQL中,其他事务新增的数据,看不到,不会产生幻读。采用多版本并发控制(MVCC)机制解决幻读问题。


4.serializable(串行化)


可读,不可写。像java中的锁,写数据必须等待另一个事务结束。

关于Mysql的锁机制:

1.表级锁:

表级别的锁定是MySQL各存储引擎中最大粒度的锁定机制。该锁定机制最大的特点是实现逻辑简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免死锁问题。 

当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度较低

2.页级锁:

页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。 

在MySQL数据库中,使用表级锁定的主要是MyISAM,Memory,CSV等一些非事务性存储引擎,而使用行级锁定的主要是Innodb存储引擎和NDBCluster存储引擎,页级锁定主要是BerkeleyDB存储引擎的锁定方式。

3.行级锁

行级锁定是目前各大数据库管理软件所实现的锁定颗粒度最小的,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。 

但是由于锁定资源的颗粒度很小,所以每次获取锁和释放锁消耗的资源也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁

总的来说,Innodb的锁定机制和Oracle数据库有不少相似之处。Innodb的行级锁定同样分为两种类型,共享锁排他锁,而在锁定机制的实现过程中为了让行级锁定和表级锁定共存,Innodb也同样使用了意向锁(表级锁定)的概念,也就有了意向共享锁意向排他锁这两种。

当对某个资源加锁时,如果 

- 有共享锁,可以再加一个共享锁,不过不能加排他锁。 这个很好理解,就是多个事物只能读数据,不能同时改数据了。Mysql innodb 默认对select 是不加锁的,如果想加共享锁,则需要 select * from table lock in share mode.

- 有排它锁,就在表上添加意向共享锁或意向排他锁。 而对于排他锁并不是对数据加锁后,其事物不能读或者改数据,而是不能对其加其他锁。Mysql中innodb的insert update delete是默认加排他锁的。如果想对查询语句加排他锁可以:  select * from table for update;


意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。所以,可以说Innodb的锁定模式实际上可以分为四种:共享锁(S),排他锁(X),意向共享锁(IS)和意向排他锁(IX)