MySQL的事物级别以及MySQL的锁机制

一、事物级别

1.read uncommitted(未提交读)

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

2.reda committed(提交读)

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

3.repeatable read(重复读是MYSQL默认的隔离级别)

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

4.serializable(串行化)

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

二、锁机制

1.表级锁

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

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

2.页级锁

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

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

3.行级锁

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

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

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

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

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

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

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

  

猜你喜欢

转载自www.cnblogs.com/chewing-gum/p/11242729.html
今日推荐