首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

java面试-数据库事务详解

什么是『事务』? 事务就是一组具有原子性的操作,这一组操作要么全都正确执行,要么全都不执行。事务能保证数据库从一种一致性状态转换为另一种一致性状态。 事务的四大特性ACID 1. 原子性 原子性指的是事务是一个不可分割的操作,要么全都正确执行,要么全都不执行。 2. 一致性 事务开始前和事务结束后,数据库的完整性约束没有被破坏。 3. 隔离性 事务的执行是相互独立的,它们不会相互干扰,一个事务不会看到另一个正在运行过程中的事务的数据。 4. 持久性 事务结束后,事务的结果必须是永久保存的。即使数据库发生崩溃,在数据库恢复后事务提交的结果仍然不会丢失。PS:事务只能保证数据库的高可靠性,即数据库本身发生问题后,事务提交后的数据仍然能恢复;而如果不是数据库本身的故障,如硬盘损坏了,那么事务提交的数据可能就丢失了。这属于『高可用性』的范畴。因此,事务只能保证数据库的『高可靠性』,而『高可用性』需要整个系统共同配合实现。 事务的分类 1. 扁平事务 它是实际生产环境中最常用、最简单的事务类型。 事务从BEGIN WORK开始,从COMMIT WORK或ROLLBACK WORK结束。 缺点:发生错误时回滚到事务的起始位置,无法回滚部分操作。而回滚所有的操作开销太大。 2. 带有保存点的扁平事务 这种事务能设置多个保存点,当发生错误时可以回滚到事务中指定的保存点,而不需要将整个事务回滚。 3. 链事务 4. 嵌套事务 5. 分布式事务 数据库并发访问会出现的问题 1. 更新丢失 当有两个并发执行的事务,更新同一行数据,那么有可能一个事务会把另一个事务的更新覆盖掉。当数据库没有加任何锁操作的情况下会发生。 2. 脏读 一个事务读到另一个尚未提交的事务中的数据。该数据可能会被回滚从而失效。如果第一个事务拿着失效的数据去处理那就发生错误了。 3. 不可重复读 不可重复度的含义:一个事务对同一行数据读了两次,却得到了不同的结果。它具体分为如下两种情况:1. 虚读:在事务1两次读取同一记录的过程中,事务2对该记录进行了修改,从而事务1第二次读到了不一样的记录。2. 幻读:事务1在两次查询的过程中,事务2对该表进行了插入、删除操作,从而事务1第二次查询的结果发生了变化。 与『脏读』的区别?脏读读到的是尚未提交的数据,而不可重复读读到的是已经提交的数据,只不过在两次读的过程中数据被另一个事务改过了。 事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 1. Read uncommitted 读未提交 在该级别下,一个事务对一行数据修改的过程中,不允许另一个事务对该行数据进行修改,但允许另一个事务对该行数据读。因此本级别下,不会出现更新丢失,但会出现脏读、不可重复读。 2. Read committed 读提交 在该级别下,未提交的写事务不允许其他事务访问该行,因此不会出现脏读;但是读取数据的事务允许其他事务的访问该行数据,因此会出现不可重复读的情况。 3. Repeatable read 重复读 在该级别下,读事务禁止写事务,但允许读事务,因此不会出现同一事务两次读到不同的数据的情况(不可重复读),且写事务禁止其他一切事务。 4. Serializable 序列化 该级别要求所有事务都必须串行执行,因此能避免一切因并发引起的问题,但效率很低。 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。 使用事务的注意事项 1. 不要在循环中提交事务 2. 不要使用自动提交 3. 不要使用自动回滚 4. 不要使用长事务

优秀的个人博客,低调大师

java面试-彻底搞懂红黑树

红黑树性质 1、每个结点或是红色的,或是黑色的2、根节点是黑色的3、每个叶结点(NIL)是黑色的4、如果一个节点是红色的,则它的两个儿子都是黑色的。5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。 和AVL树的比较 AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。 红黑树用非严格的平衡来降低插入删除时旋转的次数。 因此,如果你的业务中查找远远多于插入、删除,那选AVL树;如果查找、插入、删除频率差不多,那么选择红黑树。 插入过程 默认插入的结点为红色。为何?因为红黑树中黑节点至少是红节点的两倍,因此插入节点的父节点为黑色的概率较大,而此时并不需要作任何调整,因此效率较高。 1. 父为黑 插入后无需任何操作。由于黑节点个数至少为红节点的两倍,因此父为黑的情况较多,而这种情况在插入后无需任何调整,这就是红黑树比AVL树插入效率高的原因! 2. 父为红 父为红的情况破坏了红黑树的性质,此时需要根据叔叔的颜色来做不同的处理。 叔叔为红此时很简单,只需交换爸爸、叔叔和爷爷的颜色即可。此时若爷爷节点和太爷爷节点颜色相同,再以爷爷节点为起始节点,进行刚才相同的操作,即:根据爷爷的兄弟颜色做相应的操作。 叔叔为黑此时较为复杂,分如下四种情况:a)爸爸在左、叔叔在右、我在左以爸爸为根节点,进行一次R旋转。b)爸爸在左、叔叔在右、我在右先以我为根节点,进行一次L旋转;再以我为根节点,进行一次R旋转。c)叔叔在左、爸爸在右、我在左先以我为根节点,进行一次R旋转;再以我为根节点,进行一次L旋转。d)叔叔在左、爸爸在右、我在右以爸爸为根节点,进行一次L旋转。 删除过程 二叉搜索树的删除 若删除二叉搜索树的节点A,实际上删除的是二叉搜索树中序遍历的前驱节点,注意:1. 这个被删除节点要么就是一个叶子节点,2. 要么有且仅有一个左孩子然后将孩子顶替它原来的位置,最后将被删的节点值覆盖待删除的那个节点A。 红黑树按照二叉搜索树的方式删除节点,之后再进行相应的旋转操作,使得删除后的树仍然是一棵红黑树。 定义 待删除节点:要删除的那个节点 实际删除节点:待删除节点的中序遍历前驱 红黑树实际删除节点的性质 实际删除节点要么是叶子节点,要么有且仅有一个左孩子; 若为叶子节点,必为红色; 若实际删除节点还有孩子,则该必为左孩子;a)若左孩子为红色,则实际删除节点必为黑色;b)若左孩子为黑色,则实际删除节点红黑均可以。 约定 蓝色箭头:表示判定点 在删除操作开始前,蓝色箭头首先指向实际删除节点。 『实际删除节点』在图中以『父』表示。 旋转过程开始: 1. 父为红色(待删节点为叶子) 直接删除父节点即可: 2. 父为黑 子为红(待删节点为黑、待删节点子节点为红+左孩子) 用子节点覆盖父节点,并保持父节点的颜色: 3. 父为黑 子为黑(待删节点和子节点均为黑) 3.1. 叔叔为红 PS:叔叔为红,则爷爷必为黑! 父在左 叔在右a)子节点覆盖父节点b)进行一次左旋 父在右 叔在左a)子节点覆盖父节点b)进行一次右旋 3.2. 叔叔为黑 PS:叔叔、爸爸都为黑,那爷爷颜色就不确定了! 祖父红 两个侄子黑以下两种情况操作一致:1.子覆盖父(删除)2.交换祖父和叔叔的颜色。 a)父在左 叔在右b)父在右 叔在左同上。 祖父黑 两个侄子黑以下两种情况操作一致:1. 祖父染成子节点的颜色;2. 子节点染成黑色;3. 叔叔染成红色a)父在左 叔在右b)父在右 叔在左 祖父颜色随意 至少有一个红侄a)红侄为左左(叔左、红侄左)1. 红侄进行一次右旋2. 红侄染成黑色3. 交换叔叔和祖父的颜色b)红侄为左右(叔左、红侄右)1. 红侄进行一次右旋+左旋2. 红侄染成父节点颜色;3. 父节点染成黑色c)红侄为右左(叔右、红侄左)1. 红侄进行一次右旋+左旋2. 红侄染成父节点颜色;3. 父节点染成黑色;d)红侄为右右(叔右、红侄右)1. 红侄进行一次左旋2. 叔叔染成父节点颜色;3. 红侄染成黑色;

优秀的个人博客,低调大师

Java用Jackson遍历json所有节点

<!-- jackson begin --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.1.4</version> </dependency> <!-- jackson end --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> public static void jsonLeaf(JsonNode node) { if (node.isValueNode()) { System.out.println(node.toString()); return; } if (node.isObject()) { Iterator<Entry<String, JsonNode>> it = node.fields(); while (it.hasNext()) { Entry<String, JsonNode> entry = it.next(); jsonLeaf(entry.getValue()); } } if (node.isArray()) { Iterator<JsonNode> it = node.iterator(); while (it.hasNext()) { jsonLeaf(it.next()); } } } public static void main(String[] args) { try { String json = FileUtils.readFileToString(new File("C://test.json"), "UTF-8"); ObjectMapper jackson = new ObjectMapper(); JsonNode node = jackson.readTree(txt); jsonLeaf(node); } catch(Exception e) { e.printStackTrace(); } } 部分代码来源于自动化测试REST API工具Wisdom RESTClienthttps://github.com/Wisdom-Projects/rest-client

优秀的个人博客,低调大师

Java用Gson遍历json所有节点

<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> public static void jsonTree(JsonElement e) { if (e.isJsonNull()) { System.out.println(e.toString()); return; } if (e.isJsonPrimitive()) { System.out.println(e.toString()); return; } if (e.isJsonArray()) { JsonArray ja = e.getAsJsonArray(); if (null != ja) { for (JsonElement ae : ja) { jsonTree(ae); } } return; } if (e.isJsonObject()) { Set<Entry<String, JsonElement>> es = e.getAsJsonObject().entrySet(); for (Entry<String, JsonElement> en : es) { jsonTree(en.getValue()); } } } public static void main(String[] args) { try { String json = FileUtils.readFileToString(new File("C://test//test.txt"), "UTF-8"); JsonParser p = new JsonParser(); JsonElement e = p.parse(json); jsonTree(e); } catch(Exception e) { e.printStackTrace(); } } 代码示例来源于自动化测试REST API工具Wisdom RESTClient https://github.com/Wisdom-Projects/rest-client

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册