2021年阅读的10本软件工程书籍
|
前言 有时候你可能有个疑问,IDE总是可以检测到外部文件是否发生了变化,比如你在某个类里面加了一些代码,这时候的IDE就会弹出一个框说你做了更改。再或者是某个文件夹下的文件发生了改变,比如新建了一个或者是删除了一个等等。这时候我们的IDE依然可以检测到。这个功能到底是如何实现的呢?这篇文章主要是研究NIO的其中一个类,叫做WatchService。 也有一些其他的方式可以轻松地实现监控文件夹的功能,比如说java轮询的方式,或者是common-io的方式,我会慢慢比较。 OK,我们直接来看一下简单例子如何实现,再去分析如何实现的? 一、代码实现1、简单案例
这个代码很简单,只需要四步: 不仅插入 f_id = 10 的记录需要等待事务A提交,f_id <10、10< f_id <30 的记录也无法完成,而大于等于30的记录则不受影响,这足以解决幻读问题了。 刚刚讲的是f_id 是索引列的情况,那么如果 f_id不是索引列会怎么样呢? 这时候数据库会为整个表加上间隙锁。所以,如果是没有索引的话,不管 f_id 是否大于等于30,都要等待事务A提交才可以成功插入。
面试官:好了,各位看官朋友们,事务的隔离级别这个面试点你们清楚了吗?希望你们的面试不会被这个问题难倒哟~ 面试官:嗯,答的很对。那你说说事务有哪几种隔离级别呢? 小张:事务隔离级别从高到低有四种隔离级别,分别是:串行化(SERIALIZABLE) 、可重复读(REPEATABLE READ)、读提交(READ COMMITTED)、读未提交(READ UNCOMMITTED)。 面试官:嗯嗯,那你能说说这四种隔离级别分别会造成什么问题吗? (小张窃喜,我就知道你要这么问,还好我平时关注了 ‘ JAVA日知录 ’ 的公众号) 小张:好的,面试官。 如果数据库采用 读未提交(READ UNCOMMITTED)这种隔离级别,会造成 脏读。事务还没提交别人就能看到,这样就不能保证你读取到的数据是最终的数据,万一别人把事务回滚了,那就出现了脏数据问题。 读提交(READ COMMITTED)是指一个事务只能读取到其他事务已经提交了的数据,这样就不会出现脏读的问题,但是它会带来」不可重复读 的问题。比如 A事务 将一个人的姓名从张三改成李四,B事务在A事务提交之前读取到的是张三,但是在A事务提交之后就变成了李四。 可重复读(REPEATABLE READ):可重复读是为了解决READ COMMITTED带来的不可重复读问题,指的是事务不会读取到其他事务对已有数据的修改,即使数据已经提交了。也就是说事务开始读取到的是什么,在事务提交之前的任意时刻,这些数据都一样。虽然解决了不可重复读问题,但是他又会带来 幻读 的问题。比如A事务将张三修改成李四,B事务再插入一个名叫李四的用户,此时事务A再查找名叫李四的用户会发现多了一条,出现了2个李四,这就是幻读。 串行化(SERIALIZABLE):解决了上面出现的所有问题,但是它效率最差,它将事务的执行变成顺序执行了。 面试官:回答的不错,那你知道 MySQL的默认隔离级别是什么吗? 小张:Mysql默认的隔离级别是REPEATABLE READ,Oracle则采用的是READ COMMITTED。 面试官:但是我们使用MySQL的时候并没有出现幻读啊,怎么解决的? 小张擦了擦汗,开始有点紧张了:额,InnoDB主要是利用锁来解决幻读问题的。 面试官:对,是采用了锁,那么具体怎么实现的呢? 小张:我...我突然有点事,我先回去了。 面试官:要了解InnoDB怎么解决幻读得先知道InnoDB有哪几种锁。
注意,如果走唯一索引,那么Next-Key Lock会降级为Record Lock,即仅锁住索引本身,而不是范围。也就是说Next-Key Lock前置条件为事务隔离级别为RR且查询的索引走的非唯一索引、主键索引。
下面我们通过具体的例子来模拟上面出现的幻读问题: (编辑:唐山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


