蓝盟IT外包,提供MySQL锁定机制

发布者:上海IT外包来源:http://www.lanmon.net点击数:1502

蓝盟IT小贴士,来喽!
无论何时存在多个连接,如果在同一时间修改数据,都会出现并发控制问题。 MySQL提供服务层和引擎层两个级别的并发控制。
密钥分类
按使用场景分类
共享锁定:“共享锁定”也称为“读锁定”。 共享锁是共享的,或者彼此没有被阻止。 多个连接可以同时读取相同的资源,而不会相互干扰。
排他锁定:“排他锁定”也称为“灯光锁定”。 写锁定是独占的。 也就是说,一个写入锁定阻止另一个写入锁定和读取锁定。
根据上锁思想进行分类
悲观锁定:即使数据被外部修改,也保持悲观态度,在数据处理过程中数据被锁定。
乐观锁定:一般认为数据不会发生冲突,在数据更新时会检查数据是否发生冲突。
按锁定粒度分类
全局锁定:锁定整个数据库实例,并将整个数据库实例设置为只读。
表级锁定:如何锁定整个表。 MySQL表级锁分为表锁和元数据锁。
行级锁定:行锁定可以最大限度地支持并发处理。 行锁由存储引擎层实现,但MySQL服务器层没有实现行锁。 InnoDB存储引擎的行级锁定类型:记录锁定、间隙锁定、下一个密钥锁定。
读写锁定
读钥匙
共享锁定:“共享锁定”也称为“读锁定”。 共享锁是共享的,或者彼此没有被阻止。 多个连接可以同时读取相同的资源,而不会相互干扰。
上锁命令
选择……锁定共享模式;
测试
在测试时设置事务的手动提交: set  autocommit=0。 之后,如果没有明确的提示,autocommit全部为0。
测试时,打开两个窗口建立两个连接,窗口1和窗口2分别对应于事务a和事务b。
查询窗口id=6的行数据,添加读锁定,正确返回数据。
在查询窗口id=6的行数据的状态下添加读锁定,正确返回数据。 阅读不矛盾。
如果对窗口id=6的行执行写入(update语句),则在提交窗口2的事务之前可能会阻止写入,并导致超时终止。
如果灯锁的等待时间过长,将超时。
窗口1
mysql大于更新用户设置空间=20 where  id=6错误1205 (hy  000 ) :锁定等待时间已执行; 树恢复事务处理
如果在窗口1的事务等待写入操作的同时,窗口2的事务也执行同一行的数据写入操作,则会发生死锁错误。
窗口2
mysql大于更新用户设置空间=30 where  id=6
错误1213 (40001 ) :删除锁定扩展标志锁定; 树恢复事务处理
写入锁定
独占锁定也称为“灯光锁定”。 写锁定是独占的。 也就是说,一个写入锁定阻止另一个写入锁定和读取锁定。
上锁命令
选择.更新;
测试
查询窗口id=6的行数据,添加写锁定,正确返回数据。
在查询窗口id=6的行数据的情况下添加写锁定,并阻止。 书写冲突。
对窗口id=6的行执行写入(update语句),写入未被阻止。
窗口1事务提交后,窗口2的查询语句将返回结果。
悲观摇滚和乐观摇滚
乐观摇滚和悲观摇滚都是人们定义的概念,不是摇滚的实现,而是思想。 乐观锁定适合泛读少的场景,悲观锁定适合泛读少的场景。
悲观的锁
修改数据库中的数据时,可以通过锁定数据来防止并发问题,从而防止其他人同时修改同一行的数据。 利用这种数据库的锁定机构在修改数据之前进行锁定和修改的方式被称为悲观锁定(Pessimistic  Lock  )。
悲观锁定具有很强的垄断性和排他性,在整个数据的写入操作过程中锁定了数据。 悲观锁定的实现往往需要数据库提供的锁定机制。
悲观锁定的实现:
数据库锁定机制(如行锁定、表锁定、读锁定和写锁定)是在操作之前锁定的操作,也是悲观的锁定。
在Java中学到的synchronized关键字也是悲观的摇滚。
乐观的钥匙
乐观锁定是对悲观锁定的概念,乐观锁定一般假设数据不同时冲突,在数据更新时验证数据有无冲突。 如果有冲突,请告知用户结果,并由用户决定下一步要做什么。
乐观锁定是一种宽松的锁定方式,不需要使用数据库本身的锁定机制。实现乐观锁定:
MVCC,利用数据库的多版本控制版本号控制数据更新的并发问题,是乐观锁定的实现。

CAS,比较和交换是Java中乐观锁定的实现。

文/上海蓝盟   IT外包专家

IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部