乐观锁

加上一个版本控制即可

读写锁

会话0:
lock table tablelock read;
select * from tablelock; —读(查),可以(自己加了锁,自己可以读)
delete from tablelock where id=1; —写(增删改),不可以

在当前会话中访问其他表(emp表,未加锁):
select * from emp; —读,不可以
delete from emp where eid = 1; —写,不可以

结论1:
—如果某一个会话,对A表加了锁,则该会话可以对A表进行读操作,不能进行写操作;且该会话不能对其他表进行读、写操作。
—即如果给A表加了读锁,则当前会话只能对A表进行读操作。

会话1(其他会话):
select * from tablelock; —读(查),可以
delete from tablelock where id=1; —写,会“等待”会话0将锁释放

select * from emp; —读(查),可以
delete from emp where eid=1; —写,可以

结论2:
会话0给A表加了锁:

其他会话的操作:
a.可以对其他表(A表以外的表)进行读、写操作
b.对A表:读–可以;写–需要等待释放锁

加写锁:

会话0:
lock table tablelock write;
结论:当前会话(会话0)可以对加了写锁的表进行任何操作(增删改查);但是不能操作(增删改查)其他表

其他会话:
对会话0中加写锁的表可以进行增删改查的前提是:等待会话0释放写锁

MySQL表级锁的锁模式:
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,
在执行更新操作(增删改(DML))前,会自动给涉及的表加写锁。

所以对MyISAM表进行操作,会有以下情况:
a.对MyISAM表的读操作(如读锁),不会阻塞其他进程(会话)对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b.对MyISAM表的写操作(加写锁),会阻塞其他进程(会话)对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。

行锁(InnoDB 需要命中索引,否则行锁无效)

创建行锁条件:

1、表中创建索引, select 。。。 where 字段(必须是索引) 不然行锁就无效。

2、必须要有事务,这样才是 行锁(排他锁)

3、在select 语句后面 加 上 FOR UPDATE;

例子: 测试是否 加了锁,先执行 1 后执行 2

查询1

START TRANSACTION; #加事务

SELECT UserID,Password,Age FROM AccountsDB.Accounts_InFo WHERE Accounts = ‘hello2’ FOR UPDATE; #加锁

select SLEEP(5); # 睡眠

COMMIT; #提交

查询2 :

START TRANSACTION;
SELECT UserID,Password,Age FROM AccountsDB.Accounts_InFo WHERE Accounts = ‘hello2’ FOR UPDATE;
COMMIT;