在实验环境MySQL5.6、存储引擎:InnoDB中,揭开“锁”的神秘面纱,捋一捋我对这几个概念的想法
我们在操作数据库的时候,可能会由于并发得问题而引起得数据得不一致性(数据冲突)
– 乐观锁 –
举例:
下单操作包括3步骤:
1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};

与乐观锁相对应就是悲观锁了。悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟Java中的Synchronized很相似,所以悲观锁需要耗费较多的时间。
另外与乐观锁相对应的悲观锁是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了。
说到这里,由悲观锁涉及到的另外两个锁概念就出来了,它们就是共享锁与排它锁。共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。
– 共享锁 –
共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁。相当于对于同一把门,它拥有多个钥匙一样。就像这样,你家有一个大门,大门的钥匙有好几把,这个就是所谓的共享锁。
刚刚说了,对于悲观锁,一般数据库已经实现了,共享锁也属于悲观锁的一种,那么共享锁在MySQL中是通过什么命令来调用呢?通过查询资料,了解到通过在执行语句后面加上lock in share mode就代表对某些资源加上共享锁了。
比如,我这里通过MySQL打开两个查询编辑器,在其中开启一个事务,并不执行commit语句 city表DDL如下:
CREATE TABLE `city` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`state` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

begin;
SELECT * from city where id = "1" lock in share mode;

update city set name="666" where id ="1";
那么证明,对于ID=1的记录加锁成功了,在上一条记录还没有commit之前,这条ID=1的记录被锁住了,只有在上一个事务释放掉锁后才能进行操作,或用共享锁才能对此数据进行操作。再实验一下:

update city set name="666" where id ="1" lock in share mode;
又尝试了下,成功!
SELECT * from city where id = "1" lock in share mode;

– 行锁 –
SELECT * from city where id = "1" lock in share mode;
– 表锁 –
未经允许不得转载:大自然的搬运工 » 揭开MySQL“锁”的神秘面纱