读锁又称为共享锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

写锁又称为排他锁,简称X锁,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

共享锁就是多个事务只能读数据不能改数据,如果有其他的update操作需要等其他事务的读锁释放,才能加写锁(排他锁).

排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。

mysql InnoDB引擎默认的修改数据语句,update,delete,insert 都会自动给涉及到的数据加上排他锁,select 语句默认不会加任何锁类型。

如果加排他锁可以使用select ...for update 语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制

锁释放,数据库在事务提交之后锁才会释放。

下面开始验证

查看事务是否自动提交
SHOW VARIABLES LIKE 'autocommit';

设置事务不自动提交
SET autocommit = 0


开启事务1
start transaction;
读操作默认没有添加锁
select * from sys_user where id='1' 
UPDATE sys_user set `avatar`="头像1" where id='1';

提交事务
commit work;

开启事务2
start transaction;
查数据操作的时候添加读锁 共享锁   读操作默认没有 
select * from sys_user where id='1' LOCK IN SHARE MODE;
UPDATE sys_user set `avatar`="头像1" where id='1';

提交事务
commit work;



开启事务3
start transaction;
查数据操作的时候添加读锁 共享锁   读操作默认没有 
select * from sys_user where id='1'  LOCK IN SHARE MODE;
UPDATE sys_user set `avatar`="头像2" where id='1'

commit work;

数据库的事务基本时默认的 不可重复读

开启事务1的时候 对其他事务没有任何影响

开启事务2 执行读操作,开启事务3 执行更新操作,在事务2提交前事务3不允许提交事务,当2提交后,3更新操作成功 事务可以提交.

开启事务2 执行读操作,开启事务3 读操作并且执行更新操作, 这时3的更新操作在等待, 如果这时再执行事务2的更新操作,事务2会报死锁回滚事务.