1:事务前提
必须设置引擎innodb
设置表引擎
innodb alter table 表名 engine=innodb
对表属性的修改
设置会话自动提交关闭
show session variables like “autocommit”
set session autocommit=0
sql语句
start transaction 开启事务或者 begin
rollback
commit
分组聚合having结合
show session VARIABLES like "autocommit";
show status like "table%"
set session autocommit=0;
alter table admer1 engine=INNODB
begin;
select * from things where id=3 for UPDATE/lock in share mode;
ROLLBACK
COMMIT
共享锁 是读锁
排它锁 是写锁
两个锁不能共存
普通查询select是不加锁的
而insert,delete,update是默认加上排他锁的
普通查询也是可以 for UPDATE排它锁/lock in share mode共享锁;
当你开始事务的时候添加排它锁或者共享锁都可以普通查询
当你开启事务加上了锁,
比如给普通查询上共享锁或者排它锁,就不能修改,原因两个锁不能共存
比如给修改的时候,可以普通查询,但是不能加锁查询,即使普通查询也是原来的数据,不是修改的数据,因为事务还没有提交,这样就可以解决一些脏读,幻读,不可重复读,当然这也和mysql隔离级别有关,REPEATABLE-READ(可重复)读是默认的。
一些特价抢购,秒杀等等场景经常使用
SELECT @@tx_isolation
只能给select加锁 其他修改语句自定义意向锁
for update 排它锁 写锁
lock in share mode 共享锁又是读锁
加锁可以设置主键索引 提高细粒度,当然细粒度也是看需要
当一个用户开始到提交 锁才会释放
锁释放之后就会没有锁 自然可以加上排他锁共享锁都可以查询