课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
MySQL数据库的学习与应用在许多软件开发项目中都是非常常见的一个技术应用,而本文我们就通过案例分析来简单了解一下,MySQL事务隔离性的实现方法分享。
共享读锁(TableReadLock)
共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改
对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;也即当一个session给表加读锁,其他session也可以继续读取该表,但所有更新、删除和插入将会阻塞,直到将表解锁。MyISAM引擎在执行select时会自动给相关表加读锁,在执行update、delete和insert时会自动给相关表加写锁
独占写锁(TableWriteLock)
排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改
独占写锁也被称之为排他写锁,MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的。也即当一个session给表加写锁,其他session所有读取、更新、删除和插入将会阻塞,直到将表解锁
共享锁和独占锁的兼容性
行锁Row-levellocking
在MySQL中支持行锁的引擎是InnoDB,所以我们这里我们指的行锁主要是说InnoDB的行锁。
InnoDB锁的实现和Oracle非常类似,提供一致性的非锁定读、行级锁支持。行级锁没有相关额外的开销,并可以同时得到并发性和一致性。
lock与latch
Latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB中,latch又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。
Lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。
自增长与锁
自增长在数据库中是非常常见的一种属性,也是选的主键方式。在InnoDB的内存结构中,对每个含有自增长值的表都有一个自增长计数器(auto-incrementcounter)。
插入操作会依据这个自增长的计数器值加1赋予自增长列。这个实现方式称做AUTO-INCLocking,采用了一种特殊的表锁机制,为了提高插入的性能,锁不是在一个事务完成后才释放,而是在完成对自增长值插入的SQL语句后立即释放。
因此InnoDB提供了一种轻量级互斥量的自增长实现机制,大大提高了自增长值插入的性能。同时提供了一个参数innodb_autoinc_lock_mode来控制自增长的模式,该参数的默认值为1。了解其实现之前,先对自增长的插入进行分类。
外键和锁
外键主要用于引用完整性的约束检查。InnoDB对于一个外键列,如果没有显式地对这个列加索引,会自动对其加一个索引,可以避免表锁。而Oracle不会自动添加索引,需要手动添加,可能会产生死锁问题。
对于外键值的插入或更新,先需要查询(select)父表中的记录。但是select父表操作不是使用一致性非锁定读,因为这会导致数据不一致的问题,因此这时使用的是SELECT…LOCKINSHAREMODE方式,即主动对父表加一个S锁。如果这时父表上已经加了X锁,子表上的操作会被阻塞。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。