82张图带你了解MySQL的 高级内容(一)

开课吧开课吧锤锤2021-03-03 11:50

    Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

    本文思维导图如下。

Java

    事务控制和锁定语句

    我们知道,MyISAM和MEMORY存储引擎支持表级锁定(table-levellocking),InnoDB存储引擎支持行级锁定(row-levellocking),BDB存储引擎支持页级锁定(page-levellocking)。各个锁定级别的特点如下

    页级锁:销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

    表级锁:表级锁是对整张表进行加锁,MyISAM和MEMORY主要支持表级锁,表级锁加锁快,不会出现死锁,锁的粒度比较粗,并发度最低

    行级锁:行级锁可以说是MySQL中粒度最细的一种锁了,InnoDB支持行级锁,行级锁容易发生死锁,并发度比较好,同时锁的开销也比较大。

    MySQL默认情况下支持表级锁定和行级锁定。但是在某些情况下需要手动控制事务以确保整个事务的完整性,下面我们就来探讨一下事务控制。但是在探讨事务控制之前我们先来认识一下两个锁定语句

    锁定语句

    MySQL的锁定语句主要有两个Lock和unLock,LockTables可用于锁定当前线程的表,就跟Java语法中的Lock锁的用法是一样的,如果表锁定,意味着其他线程不能再操作表,直到锁定被释放为止。如下图所示

    locktablecxuan005read;

Java

    我们锁定了cxuan005的read锁,然后这时我们再进行一次查询,看看是否能够执行这条语句

    select*fromcxuan005whereid=111;

Java

    可以看到,在进行read锁定了,我们仍旧能够执行查询语句。

    现在我们另外起一个窗口,相当于另起了一个线程来进行查询操作。

    select*fromcxuan005;

Java

    这是第二个窗口执行查询的结果,可以看到,在一个线程执行read锁定后,其他线程仍然可以进行表的查询操作。

    那么第二个线程能否执行更新操作呢?我们来看一下

    updatecxuan005setinfo='cxuan'whereid=111;

Java

    发生了什么?怎么没有提示结果呢?其实这个情况下表示cxuan005已经被加上了read锁,由于当前线程不是持有锁的线程,所以当前线程无法执行更新。

    解锁语句

    现在我们把窗口切换成持有read锁的线程,来进行read锁的解锁

    unlocktables;

Java

    在解锁完成前,进行更新的线程会一直等待,直到解锁完成后,才会进行更新。我们可以看一下更新线程的结果。

Java

    可以看到,线程已经更新完毕,我们看一下更新的结果

    select*fromcxuan005whereid=111;

Java

    如上图所示,id=111的值已经被更新成了cxuan。

    以上内容由开课吧老师程序员cxuan提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享