mysql之锁机制

mysql默认采用的是InnoDB,默认可以支持row-level-lock,在InnoDB中,有两种锁,读共享锁和写锁,读共享锁可以多个读操作一起进行,写锁只允许一个客户端独占,由于支持的是行锁,所以在查找的时候需要有明确的主键信息,才可以
确定是那一行,然后进行加锁,没有的话,mysql会直接锁表。
读共享锁:

1
select * from tableA where id=*** LOCK IN SHARE MODE

写锁:

1
2
3
//必须指明主主键信息,才能明确到行,如果信息不能确定到具体的行的话,只能锁表,如id <> 3,
//也会直接锁表. FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。
select * from tableA where id=*** FOR UPDATE

事务:

mysql默认采用的是自动提交模式,可以采用下面的命令来修改:

1
2
set autocommit=0  //取消自动提交
set autocommit=1 //自动提交

自动提交表示你每输入一条命令,myswl自动的执行 commit,所以每一条命令对应一个事务,如果需要多条命令作为事务的话,那么需要:

1
2
3
4
5
6
BEGIN
命令1
命令2
...
...
commit

一个事务由BEGIN开始,commit结束。事务只保证所有提交的命令的执行原子性,并不能用来作为同步,默认情况下,事务是可以一起执行的,例如事务A和B都需要读取行记录r,两个事务可以并发执行。有串行模式的事务,只支持同时只有一个
事务运行,这可以用来实现同步,但是效率很低,因为一个表同时只能有一个操作。