1.什么是数据库的事务
事务:数据库操作的最小工作单元,是作为单个逻辑工作单元的一系列操作, 事务时一组不可在分割的操作集合,一系列操作要么一起成功,要么一起失败。
事务的四大特性:ACID
原子性:一系列操作的不可再分割。
一致性:数据的一致性。
隔离性:不同的事务操作相同数据的时候时相互隔离的,互不干扰 。
持久性:数据的修改是持久性的,永久保存。
数据库默认开启事,在mysql数据库中手动开启事务 begin / start transation,提交 commit,回滚 rollback
查看隔离级别 show global variables like "tx_isolation"
set session autocommit=on/off 事务是否自动启动
2.事务并发会带来什么问题
脏读:事务中读取到另一事务未提交的数据。
不可重复读:事务中,同一条件下多次读取的数据不一致,其它事务对同一数据修改。
幻读:事务中,同一条件下多次读取的数据不一致(数据的数量不一致),其它事务进行插入操作。
事务并发的三大问题都是数据库读一致性问题
3. 事务的隔离级别
读未提交( read Uncommited):事务未提交的数据对其他事务是可见的,隔离级别最低。
读已提交 (read commited):一个事物开始之后,只能看到已提交的事务所作的修改,解决脏读问题。
可重复读 (repeatable read):多次读取数据一致,解决不可重复读问题。
串行化 serializeble:所有事务按序执行,不能并发执行,隔离级别最高,效率最低。解决所有问题。
在mysql中INNODB存储引擎中,在可重复读隔离级别下(RR),采用间隙锁行锁算法,解决幻读问题。
隔离级别的实现方式:1.LBCC 依赖于锁机制实现 2.MVCC 生成一个数据请求事件点的一致性数据快照
并用这个快照提供一定级别的一致性读取
4.锁的原理与算法详解
数据库的锁: 用来管理不同事务对共享资源的并发访问
表锁和行锁的区别
锁定粒度: 表锁 > 行锁
加锁效率: 表锁 > 行锁
冲突概率: 表锁 > 行锁
并发性能: 表锁 <行锁
MyISAM只支持表锁 ,INNODB支持行锁 表锁
共享锁(行锁):又称为读锁,简称s锁,多个事务对同一数据可以共享一把锁,都能访问到数据 但是只能读,不能修改。
语法: select * from table where id =1 lock in share mode
排他锁(行锁):又称为写锁 排他锁不能与其他锁并存,事务获取到数据的排它锁,其他事务就不能获取该数据的
任何锁。 select * from table where id =1 for update
意向共享锁(表锁),意向排他锁(表锁):当行数据加共享锁或者排它锁的时候,首先会给表加意向锁。
意向锁作为一个标记,当事务想要对表加表锁时,首先会检查有无意向锁,无意向锁代表表中的任何一行记录都没有加锁,有意向锁代表表中数据加了锁,事务阻塞等待,行锁释放之后在加表锁。
为什么要加意向锁:提高加表锁的效率
锁的原理:行锁实际上锁定的是索引,不是数据
1.不使用索引: 不使用索引的情况下,给行加锁时,会锁定整张表
2主键索引:给行数据加锁时,不会锁定整张表,锁定行数据。
行锁算法:锁定了什么范围
记录锁:锁定的是某一行记录
间隙锁:锁定的是区间(左右都是开区间) 间隙锁之间不冲突
临键锁:锁定的是区间(左开右闭的区间)
默认行级算法是临键锁,当使用范围或者等值查找命中不到数据时,降为间隙锁。
脏读问题解决:可以在修改的事务中加排它锁 不允许其它事务读取,提交之后才会释放排它锁。
不可重复读问题解决:在读取数据的时候加共享锁,其它事务修改操作(排它锁)等待共享锁的释放。
幻读:采用间隙锁,锁定整个区间,其它事务在这个区间的操作都会阻塞。
感觉写的非常乱,为自己所学做一个整理,下次再详细补充。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务