mysql锁初探

1:事务

     每次执行一条sql语句,都自动进行了开启事务,提交或者回滚的操作。

     要让多个sql语句共同组成个事务,就需要手动写 begin commit rollback了

2:

    select语句默认不加锁的可以在其后面加 for update (排他锁\写锁) 或者 lock in share mode(共享锁\读锁)    

    delete\update\insert 会自动加排他锁。

    在事务提交或者回滚时才会释放锁。

3:

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

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

某个事务操作时加上了排他锁,其它事务普通的select(不加锁)还是能读取到相应数据的,排他锁排斥的是其它事务也要来加锁的操作

 

4:

死锁:

    两个事务同时执行,加锁顺序相反,eg:第一个事务有两条sql语句,分别对id=1  和id=5进行加锁,另一个事务相反,则每个事务在执行第二条sql时就会产生死锁

    每个事务执行时mysql都会开启一个线程执行这个事务,当死锁时,该线程就卡主了。

    事务配合try catch使用,如果加锁失败的话会触发异常的话,那rollback也能释放该锁了吧。

5:

MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住,这点需要注意。

 

6

悲观锁和乐观锁是数据库并发控制的两种思想,方法。

悲观锁:利用数据库的锁机制(行锁,读锁,写锁,表锁),来实现并发控制,适用于数据竞争激烈的场景

乐观锁:每次数据库操作,利用数据的版本号(操作时先获取当前的版本号,操作完再对版本号加1,并且获取此时的版本号和这个加1的相等不相等),来实现并发控制,不利用数据的锁机制,适用于数据竞争不激烈的场景。

 

你可能感兴趣的:(mysql)