mysql的事务和隔离级别

事务的特性:

  •   原子性
  •   一致性
  •   隔离型
  •   持久性

 

事务的隔离级别:

脏读:是一个事务读到一条数据, 另一个事务同时进行修改没有提交。在一个事务中再次读的时候出现了脏读。这个是读内存的数据

幻读 : (发生在insert中) 一个事务查询一条数据, 别一个事务新增了一条数据commit 了。 在第一个事务中再次查的时候出现先了两条,这样的就是幻读。

不可重复读:  (发生在update和detele中) 一个事务中查询一条数据  在另一个事务中去修改或者是删除一条数据的时候,再第一个事务中读数据发生了改变。

 

读未提交: read uncommitted 

读已提交:   read committed   解决了脏读

可重复度:  repeatable read   解决了脏读和不可重复读

串行化读 : serializable     解决所以事务并发的问题。

 

数据中  不添加锁的情况下  默认的是MVCC 确定了事务的一致性

锁:  事务和锁是密不可分的

  锁的粒度:行锁  表锁 

  锁的模型: 共享锁  排它锁  (都是行锁)      意向共享锁  意向排它锁 (都是表锁)    

  锁的算法:  记录锁 record locks   间隙锁 gap locks    临键锁 next-key locks

      数据库中锁    临建锁 next-key locks  默认的行锁算法     临建锁里面包含了间隙锁      间隙锁 包含了记录锁

 

  共享锁:  又叫读锁   读锁只能读数据。 加锁的方式    select * from tableName where id= 1    LOCK   IN  share   mode

  释放锁的方式:   commit  /  rollback   这两种方式。

  实例: 如果有一个主表对应的子表。 要给主表加上共享锁, 可以不让别的事务去修改它。

  排它锁 :  又叫写锁, 是和其他事务相互排斥的, 加了这排它锁, 就不能再加其他锁, 这个可以读也可以写数据,  其他事务就不能获取该行的锁了。 

    实例: 我们的update  insert  delete  默认加上的排它锁,   手动加  : select  * from  tableName  where   id =1   FOR update;  

 

数据库中锁住什么 控制了并发:

数据库表  锁住了行中索引     锁是根据表中的索引加的, 

  如果表中有主键  发生锁住了 id索引

  如果没有主键 有唯一索引  就定上索引,  

  如果没有主键 也没有索引就是 进行表锁

 

 

 

  

 

posted @ 2020-09-26 20:33  那一的眸相遇  阅读(132)  评论(0)    收藏  举报