innoDB引擎.默认对update,delete,insert加排他锁,select语句默认不加锁

1.在InnoDB引擎下,select语句一般不会也不需要自动加读锁的,就是说select默认不加锁,
手动加共享锁的方式是 select…lock in share mode.
手动加排它锁的方式是 select…for update
二者都是当前读

2.共享锁:就是读锁,当前事务给数据加了共享锁以后,其他的事务也可以给这条数据加共享锁,但是不能加排它锁(就是写锁),也就是说其他事务对这条数据只能读不能修改。

一条数据上的共享锁可以被多个事务共享,也就是能被多个事务持有,也就是可以被多线程的读。

如果想要给数据加共享锁,首先要确定数据上没有其他事务的排它锁,如果有就需要等待其他事务释放排它锁,等没有排它锁了才能申请到共享锁。

如果当前事务想要去修改数据,就需要申请到排它锁,但是如果这个数据上有其他事务的共享锁在,就会读写互斥,拿不到排它锁,如果数据上没有其他事务的共享锁或者写锁,才能申请到写锁。

同一个事务的读写锁是不会互斥的,不同事务的读锁和写锁才会互斥。

所以如果你问,当前事务可以修改当前数据吗?可以,但是有前提条件,就是其他事务在该数据上没有共享锁和排它锁,这样,它才能申请到写锁。

3.排它锁:就是写锁,update,delete,insert默认都是加写锁,想要申请到写锁,要确保该数据上没有其他事务的共享锁和排它锁。而且更新一般都是先读后写,只有先拿到数据上的共享锁,才能去拿写锁。

4.事务A读数据的时候,事务B可以修改数据吗?
如果事务A不加锁的读,事务B可以修改数据,但是因为是默认不可重复读,事务A看不到事务B的更新。
如果事务B是插入,则事务A会出现幻读。如果事务A是加锁的读,事务B就拿不到排它锁,就不能修改数据。事务手动加锁的读,就是为了解决幻读的问题。

5.事务A修改数据的时候,事务B可以读数据吗?
读不到,事务B会被阻塞,直到事务A提交,事务B才能读数据。

6.手动加共享锁的方式是 select…lock in share mode. 根据查询的结果判断需不需要在 主键索引上加锁;当前读,获取最新数据,读的期间不允许其他事务对数据进行修改,自己也不一定能修改该数据,因为其他事务可能在该数据上有共享锁。
手动加排它锁的方式是 select…for update 默认读了之后会更新,所以一定会在主键索引上加排它锁;当前读,获取最新数据,读的期间不允许其他事务对该数据进行修改,只允许自己修改该数据。
二者都是当前读