事务的特性:
- 原子性
- 一致性
- 隔离型
- 持久性
事务的隔离级别:
脏读:是一个事务读到一条数据, 另一个事务同时进行修改没有提交。在一个事务中再次读的时候出现了脏读。这个是读内存的数据
幻读 : (发生在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索引
如果没有主键 有唯一索引 就定上索引,
如果没有主键 也没有索引就是 进行表锁