首页 > 代码库 > 悲观锁、乐观锁、行级锁、表级锁
悲观锁、乐观锁、行级锁、表级锁
1. 悲观锁(加的是表级锁)
一方:查询语句加 for update;另一方:查询语句加 for update;
当进行更新语句的时候,另一方不能进行更新操作
2. 乐观锁
更新语句设置版本号,在指定版本中更新数据
一方:update account set money=money-200,version=version+1 where id=1 and version=0;
另一方同时操作同一个版本号,则不能更新数据
另一方:update account set money=money+200,version=version+1 where id=1 and version=0;
当执行事务时,相当于执行了锁,来保持数据的一致性,但是锁分多种,有行锁,表锁。
行锁就是只锁定那一行,那一条记录,别的连接下的操作还可以操作这张表。
表锁就是锁定整张表,只有当前连接执行完事务,才可以解锁。
以mysql为例,有索引并且使用了该索引当条件的时候就是行锁,没有索引的时候就是表锁。innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的。
建议:对于插入操作,一般加表锁,但是对于修改和删除操作,最好加行锁,这样在高并发时,不用等太久。
加锁方式:
select * from testlock where id=1 for update;
##查询加锁,查询时不允许更改,该语句在自动提交为off或事务中生效,相当于更改操作,模拟加锁。
update testlock name=name;
##列=同一个列
更新操作,插入,删除操作,在事务中均属于加锁
在调用存储过程中,就会涉及到表锁,行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索。innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的.表锁演示(无索引)Session1:mysql> set autocommit=0;mysql> select * from innodb_test;+------+-------------+| id | name |+------+-------------+| 1 | woshiceshi | | 2 | woshiceshi2 | | 3 | woshiceshi3 | +------+-------------+mysql> select * from innodb_test where id = 2 for update;+------+------------+| id | name |+------+------------+| 2 | woshiceshi2 | +------+------------+Session2:mysql> update innodb_test set name=‘sjis‘ where id = 1 ;处于等待状态....再回到session1 commit以后,session2就出来结果了(锁定了8秒,过了8秒左右才去session1提交)。mysql> update innodb_test set name=‘sjis‘ where id = 1 ;Query OK, 1 row affected (8.11 sec)Rows matched: 1 Changed: 1 Warnings: 0实验结果是:我在session1的for update 操作看似只锁定ID为2的行其实锁定了全表,以至于后面session2的对ID为1的行update 需要等待Session1锁的释放。行锁演示(索引为ID)Session1:mysql> alter table innodb_test add index idx_id(id);Query OK, 4 rows affected (0.01 sec)Records: 4 Duplicates: 0 Warnings: 0mysql> select * from innodb_test where id = 2 for update;+------+------------+| id | name |+------+------------+| 2 | woshiceshi2 | +------+------------+Session2:mysql> update innodb_test set name=‘wohaishiceshi‘ where id = 1 ;Query OK, 1 row affected (0.02 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from innodb_test where id = 1; +------+---------------+| id | name |+------+---------------+| 1 | wohaishiceshi | +------+---------------+1 row in set (0.00 sec)实验结果:这次的锁定是锁定的行,所以没有被锁定的行(ID不为2的行)可以进行update..
悲观锁、乐观锁、行级锁、表级锁
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。