mysql可能出现什么和并发相关问题?
- 脏读:读到未提交事务的修改
- 不可重复读:一个事务内两次读取不一致
- 幻读:一个事务内两次读取记录数不一致
哪些场景不适合脏读,举个例子?
- 银行系统
- 库存管理系统
- 在线订单系统
mysql的是怎么解决并发问题的?
- 锁机制:行级锁、表级锁、页级锁等
- 事务隔离:读未提交、读已提交、可重复读和串行化
- MVCC:通过在数据库中保存不同版本的数据来实现不同事务之间的隔离
可重复读隔离级别下,A事务提交的数据,在B事务能看见吗?
Mysql 设置了可重读隔离级后,怎么保证不发生幻读?
尽量在开启事务之后,马上执行 select … for update 这类锁定读的语句,因为它会对记录加 next-key lock,从而避免其他事务插入一条新记录,就避免了幻读的问题。
串行化隔离级别是通过什么实现的?
是通过行级锁来实现的,序列化隔离级别下,普通的 select 查询是会对记录加 S 型的 next-key 锁,其他事务就没没办法对这些已经加锁的记录进行增删改操作了,从而避免了脏读、不可重复读和幻读现象。
MVCC实现原理
对于「读提交」和「可重复读」隔离级别的事务来说,它们是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同。
一条update是不是原子性的?为什么?
是原子性,主要通过锁+undolog 日志保证原子性的
执行 update 的时候,会加行级别锁,保证了一个事务更新一条记录的时候,不会被其他事务干扰。
执行 update 的时候,会加行级别锁,保证了一个事务更新一条记录的时候,不会被其他事务干扰。
滥用事务,或者一个事务里有特别多sql的弊端?
- sql太多,锁定的数据多容易造成大量的死锁和锁超时
- 回滚会占用大量存储空间,事务回滚时间长
- 执行时间长,容易造成主从延迟。主库执行完事务才会写入binlog
讲一下mysql里有哪些锁?
- 全局锁:全库逻辑备份
- 表级锁:元数据锁:对一张表进行 CRUD 操作时,加的是 MDL 读锁;对一张表做结构变更操作的时候,加的是 MDL 写锁;MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。
- 意向锁:为了快速判断表里是否有记录被加锁。
数据库的表锁和行锁有什么作用?
- 表锁:整体控制、适用于大批量操作
- 行锁:细粒度控制提高并发性能、减少锁冲突、适用于频繁单行操作
MySQL两个线程的update语句同时处理一条数据,会不会有阻塞?
两条update语句处理一张表的不同的主键范围的记录,一个<10,一个>15,会不会遇到阻塞?底层是为什么的?
如果2个范围不是主键或索引?还会阻塞吗?
会锁住全表