spring|Java程序员必会的三个技能: Spring+MySQL+并发编程( 四 )


(3)页面锁:开销时间、加锁时间、锁定粒度在 表级锁 与 行级锁 之间 , 会出现死锁 , 并发度中等 。
2.CHAR 与 VARCHAR 的区别?
(1)CHAR 长度不可变 , 范围 1~255 。 若存储长度未达到定义的长度 , 则以 空格 填充 。 存取速度快 , 但容易浪费空间 。
(2)VARCHAR 长度可变 , 范围 1~65535 。 若存储长度未达到定义的长度 , 则存实际长度数据 。 存取速度稍慢 , 但节约空间 。
3.能说下myisam 和 innodb的区别吗?
myisam引擎是5.1版本之前的默认引擎 , 支持全文检索、压缩、空间函数等 , 但是不支持事务和行级锁 , 所以一般用于有大量查询少量插入的场景来使用 , 而且myisam不支持外键 , 并且索引和数据是分开存储的 。
【spring|Java程序员必会的三个技能: Spring+MySQL+并发编程】innodb是基于聚簇索引建立的 , 和myisam相反它支持事务、外键 , 并且通过MVCC来支持高并发 , 索引和数据存储在一起 。
4.你能说下事务的基本特性和隔离级别吗?
事务:数据库中 , 对数据的一系列操作可以看成一个整体 , 称为事务 。 这个整体要么全部执行、要么全部不执行 。
ACID 属性的存在确保了 事务的可靠 。
(1)Actomicity(原子性):原子性要求 事务中的操作要么全部完成 , 要么回退成之前未操作的状态 。 即事务中某个操作失败后 , 会相当于什么都没发生 , 不会出现改了部分数据的情况 。
(2)Consistency(一致性):一致性要求 事务执行前后 , 数据库的状态一致 , 即从一个一致性状态切换到另一个一致性的状态 。
(3)Isolation(隔离性):隔离性要求 并发的事务相互隔离、不可见 。 即一个事务看不见另一个事务内部的操作以及操作的数据 。
(4)Durability(持久性):持久性要求 事务对数据库数据的修改是永久的 。 即数据一旦修改提交后 , 其状态将永久不变 。
5.并发问题 – 脏读、不可重复读、幻读?
对于同时运行的多个事务 , 若这些事务访问同一数据时 , 没有采用必要的隔离机制 , 则会造成如下的并发问题 。
(1)脏读:脏读 指的是当一个事务正在访问某数据 , 并对这个数据进行的修改 , 且这条数据还未提交到数据库中 , 此时若另一个事务也访问到这条数据 , 获取到的是这条被修改的数据 , 此时得到的数据不对 , 即脏读 。
比如:tom 年龄为 22 , 事务 A 修改 tom 年龄为 30 , 此时还未提交到数据库 , 此时事务 B 获取 tom 年龄 , 得到的是 30 , 事务 A 回滚数据 , 数据库的数据依旧是 22 , 但事务 B 拿到的数据是 30 , 这就是脏读 , 读错了数据 。
(2)不可重复读:指一个事务 , 多次读取同一条数据 , 在这个事务还未结束时 , 另一个事务也访问该数据并对其修改 , 那么可能造成事务多次读取的数据不一致 , 即不可重复读 。
比如:tom 年龄为 22 , 事务 A 读取 tom 年龄为 22 , 事务未结束 。 此时事务 B 修改 tom 年龄为 30 , 并提交到数据库 , 当事务 A 再次读取 tom 年龄为 30 , 事务 A 两次读取的数据不一致 , 即不可重复读 。
(3)幻读:指事务并不是独立执行时产生的现象 。 一个事务修改某个表 , 涉及表的所有行 , 同时另一个事务也修改表 , 比如增加或删除一条数据 。 此时第一个事务发现多出或者少了一条数据 。 这种情况就是幻读 。
比如:事务 A 查询当前表的数据总数为 11 ,此时事务 B 向表中插入一条数据 , 事务 A 再次查询当前表数据总数为 12 , 即幻读 。
注:
不可重复读、幻读理解起来有些类似 。
不可重复读是对一条数据操作 , 重点在于修改某条数据 。
幻读是对表进行操作 , 重点在于新增或删除某条数据 。
6.事务的隔离级别?
数据库系统必须具有隔离并发运行的事务的能力 , 使各事务间不会相互影响 , 避免并发问题 。


推荐阅读