天天看点

学习mysql事务

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 共享锁又是读锁

加锁可以设置主键索引 提高细粒度,当然细粒度也是看需要

当一个用户开始到提交 锁才会释放

锁释放之后就会没有锁 自然可以加上排他锁共享锁都可以查询

学习mysql事务

继续阅读