前面一章我们讲了redis的悲观锁和乐观锁,依靠是redis自身的语句,同理.mysql也要依靠自身的锁机制才能完成我们需要的效果.
悲观锁
在mysql中,悲观锁的实现需要使用select…for…update,这个是为什么呢.因为在mysql中,使用了select for update这种语句,这样会将查询到的结果集全部加上锁.这下厉害了,所以我们在使用悲观锁的时候,口头约定一定要使用唯一或者主键索引.这样才能锁住一行.在mysql中,如果我们使用了这个语句,还得将mysql自动的autocommit关闭,不然我们更新后就自动提交了,就使用不到锁机制了.使用以下sql语句,只有这样我们手动提交才能让后面的来继续操作.
1 | set autocommit = 0 |
实现悲观锁
悲观锁和乐观锁一般要用到两个文件,模拟多个用户操作.这样才能很好的看出效果.
文件1
1 | $pdo = new PDO('mysql:host=localhost;dbname=lock','root','root'); |
文件2
1 | $pdo = new PDO('mysql:host=localhost;dbname=lock','root','root'); |
当文件1在操作的时候,我们加了悲观锁.只有等文件1提交完成过后,文件2的才能继续操作,不然文件2也会卡住.这个就是悲观锁.只要上了锁,就要等我操作完成才行.
乐观锁
在mysql中,实现乐观锁很简单.因为很多框架都自带了,updated_at这个字段,用这个字段来判断.我们先得到数据.然后模拟卡顿,更新的时候,判断updated_at是不是原来的那个字段就行了.
实现乐观锁
同理,我们还是需要两个文件模拟多个人操作.
文件1
1 | $pdo = new PDO('mysql:host=localhost;dbname=lock','root','root'); |
文件2
1 | $pdo = new PDO('mysql:host=localhost;dbname=lock','root','root'); |
当我们执行文件1时,先把数据取到了,如果文件2中更新后,时间变了,我们就不更新数据就行了.这个就非常简单的乐观锁.
备注
以上代码使用了pdo,请自行安装pdo
1 | pecl install pdo |
OR
1 | sudo apt isntall php版本-pdo |
建表语句
1 | CREATE TABLE `lock` ( |