我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于Spring中的事务@Transactional知识点有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于Spring中的事务@Transactional知识点有哪些

本篇内容介绍了“基于Spring中的事务@Transactional知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

ACID,事务内的一组操作具有 原子性 、一致性、隔离性、持久性

  • Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

为什么要使用事务?

就是一组操作中,存在着多个更新修改操作,并且要满足事务的相关要求,所以就需要使用到事务。最常见的例子就是银行两个账户间的转账,包含的A扣款 、B到账等多个操作,这些个操作需要具备事务的特性。比如说,要么A成功扣款,B也成功到账;不能出现A扣款了,B没到账(原子性);也不能出现现在AB都处理成功了,后续又出现A账户的钱又增多了(持久性);也不能出现A账号初始余额充足,两个并发处理,导致出现余额为负的情况(隔离性)。

如何使用事务?

在spring中可以使用声明性的注解事务,即在有需要使用的方法、类上,用@Transactional

修饰即可。修饰的方法、类就是这个事务的包裹区域。出现了对应的异常就会在AOP中触发回滚。

默认的回滚是错误与运行异常,不包括检验异常。

基于Spring中的事务@Transactional知识点有哪些

rollbackFor参数支持用户自行设置,例如可定义异常跟运行异常,如下所示;也支持自定义异常类

@Transactional(rollbackFor = { Exception.class, RuntimeException.class })

默认的事务传播机制是Propagation.REQUIRED

事务的传播本质确定好事务的限制区域,即哪些代码是受到事务保护的,出现异常可以回滚。

细节点:

  • 代码出现事务配置的异常,在事务内的会自动回滚;如果在对应的方法体内使用了try catch捕获异常,异常没有抛出去,那就不会回滚,需要手动回滚了。在catch语句中增加手动回滚的TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句

  • public 方法的事务才生效

事务的传播带来的几种结果

  • 外层没有事务的话,内在的子方法,没有的就没有;有事务的就会有事务,有事务的效果形同Propagation.REQUIRES_NEW,互相独立,每个都是一个不同的新事务

  • 外层有事务的话,那这个整个方法都在一个事务的区域范围内,内外任何一处回滚,都是整个回滚。但是Propagation.NESTED修饰的内部方法,可以单独回滚掉自己这个内部方法,作为一个嵌入子事务所具有的独特性。

  • 外层有还是没有事务,Propagation.REQUIRES_NEW修饰的方法都是作为一个独立的事务,自己独立控制回滚与提交,与外层事务无关联。

此处举例的事务,指的是 默认值为 Propagation.REQUIRED的传播行为,以及Propagation.NESTED的传播行为。

两个特例

  • 同一个类中有A、B两个方法,A调用B方法。A没事务,B有事务,B有异常时,回滚失败


A没事务A有事务
B没事务没有事务的效果 不分析事务生效,B的异常,可以让整个A回滚
B有事务事务失效事务生效,同上 不分析

若是A/B在同一个类中,A方法有事务,B方法没有事务,这个时候事务会生效,原因是异常传导到了A方法中;

A方法没事务,B方法有事务,A调用B方法。若是A/B在同一个类中,B方法事务失效。A/B在不同的类,B方法有事务效果。

原因分析:这是动态代理导致的,当要执行B方法的回滚时,此时A调用的B方法,不是动态代理的那个类,无法进行回滚。

  • A方法循环调用B方法,A方法有事务,B方法启用新事务,B方法处理成功一条提交一条的数据;B方法遇到异常,有异常的那条回滚,不影响之前处理成功提交的数据。

从之前的推断来看,Propagation.REQUIRES_NEW修饰的内部方法独立一个新事务,跟外层没有关系,其实是两个事务了,外层事务回滚内存的也不会回滚;内层回滚也不影响外层事务。

但是实际结果还是有点不太一样,若是A/B在不同类中,可以达到这个效果;同一个类的话,就会回滚失败。跟上面AB方法调用的结果类似。

究其原因,还是由于使用了动态代理来进行事务AOP的,此时的B方法一旦触发回滚就是事务回滚异常了。那么要想一个类中两个方法间调用达到部分提交的效果,需要使用ApplicationContext 上下文对象获取当前类对象,再进行调用;

// 使用 ApplicationContext 上下文对象获取该对象;@Autowiredprivate ApplicationContext applicationContext; CurrentClass classService = applicationContext.getBean(CurrentClass.class); //再用这个对象去调用同类的其他方法classService.b();

总结: 事务的实现依赖于动态代理,因此在同一个类中使用了类的其他方法时,就需要额外注意了,只有使用动态代理的对象去调用方法时,才会有事务回滚的操作。

事务传播属性propagation

propagation 代表事务的传播行为,默认值为 Propagation.REQUIRED,总共的属性信息如下:

  • Propagation.REQUIRED:如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。(默认传播行为,一定会有一个事务)

( 也就是说如果A方法和B方法都添加了注解,在默认传播模式下,A方法内部调用B方法,会把两个方法的事务合并为一个事务 )

  • Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。(以当前是否有事务为标准,可以有事务,也可以没有事务)

  • Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。(要求当前有事务,就能运行;没有就会异常)

  • Propagation.REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。

( 当类A中的 a 方法用默认Propagation.REQUIRED模式,类B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中调用 b方法操作数据库,然而 a方法抛出异常后,b方法并没有进行回滚,因为Propagation.REQUIRES_NEW会暂停 a方法的事务 )

  • Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。(以非事务的方式运行,当前有不报错)

  • Propagation.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。

  • Propagation.NESTED :如果当前存在事务,则嵌套事务内执行,如果不存在事务和 Propagation.REQUIRED 效果一样。

( 也就是说如果A方法和B方法都添加了注解,在A默认传播模式下,B方法加上采用 Propagation.NESTED模式,A方法内部调用B方法,A回滚,B也会回滚;但B回滚,A不会回滚

数据库隔离级别

事务的隔离级别依赖于数据库的隔离级别,mysql的默认隔离级别是可重复读(repeatable read),对应的效果是在一个事务内重复读取一个表中的数据,一直会是一样的,并不会读取到那些个此事务范围内其他事务 未提交(脏读)、已提交(不可重复读)的修改记录。

在对数据进行测试隔离级别时,需要先对数据库进行一系列的设置,包括关闭自动提交、查看当前的隔离级别,相关命令如下所示:

//由于变量autocommit分会话系统变量与全局系统变量, Value的值为ON,表示autocommit开启。OFF表示autocommit关闭。show session variables like 'autocommit';show global variables like 'autocommit'; //关闭当前会话的自动提交set session autocommit=0; //开启一个事务start transaction; begin;    //回滚rollback;    //提交事务commot;
//查看当前的隔离级别   查看全局、当前会话的隔离级别select @@tx_isolation;SELECT @@global.tx_isolation, @@session.tx_isolation; //设置当前会话的隔离级别为read uncommitted级别:set session transaction isolation level read uncommitted; //设置当前会话的隔离级别为read committed级别:set session transaction isolation level read committed; //设置当前会话的隔离级别为repeatable read级别:set session transaction isolation level repeatable read; //设置当前会话的隔离级别为serializable级别:set session transaction isolation level serializable; //展示连接idselect connection_id(); //数据库超时设置查询show session variables like '%timeout';

事务的隔离级别总共分为:未提交读(read uncommitted)、已提交读(read committed)、可重复读(repeatable read)、串行化(serializable)。

下面将对这四种一一展开说明:

1、未提交读(会有脏读的现象)

A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;那么之前读取到的A事务为提交的数据就是脏数据了。最低的隔离级别,很少会使用到。

---脏读,读取到了未提交的数据(新增、修改和删除); 除此之外,还有会不可重复读、幻读的现象。

基于Spring中的事务@Transactional知识点有哪些

事务1设置如上所示,隔离级别为读未提交,关闭了自动提交。此时开始一个事务,看到的有两条数据;

基于Spring中的事务@Transactional知识点有哪些

再打开一个窗口,关闭自动提交,然后进行新增改的操作

基于Spring中的事务@Transactional知识点有哪些

最后的结果如上所示,事务1读取到了另一事务未提交时的新增、修改跟删除的数据。

2、已提交读

(会有不能重复读的现象,因为每次读取都是读最新的,那就可能前后两次会有差异了)

会读取这一段时间内其他事务对这些数据的变更操作,A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,B事务前后两次查询到的数据不一致;例如事务B要更新状态,因此先进行一次查询,此时状态为1,一系列操作后,马上就要更新了,此时再次查询,第二次查询出来的状态变成了2。

---不可重复读,一般指的是删除、更新、新增;还会有幻读的现象

基于Spring中的事务@Transactional知识点有哪些

不可重复读的结果就是事务1能够读取到另外事务的 新增、修改、删除操作,与脏读的区别在于,一个是提交后才能读取到,一个是未提交的实时操作就能读取到。

3、可重复读 (有可能覆盖掉其他事务的操作)

可重复读是mysql数据的默认隔离级别,也是使用的较多的一种隔离级别,下面重点对其分析分析。

A事务无论执行多少次,只要不提交,在这事务内同一个SQL的查询值永远都不变;可以理解成A事务内的所有查询都是 查询A事务开始时那一瞬间的数据快照;

幻读: 由于互相隔离,以及可重复读的特性,另一个事务也同时在处理同一数据的话,就会有一种空幻的现象,好像少了点什么。例如,两个事务都带id去插入同一数据,那么后插入的数据会加锁执行失败(另一事务未提交)或者主键冲突(另一事务已提交),而插入失败后再去查询,又会发现并没有找到重复那条数据的,就会有种读到了空白的感觉,少读取到了内容。 幻读不仅是插入,更新、删除也会有这样的现象的。

现实的一个例子,就是离银行还款日期之前,A去查看账单表,获取到了此次的账单数据,求得了总和,根据账单综合就将账单还清了,并且还再次查询,显示已经还清了。此时,A将本次的查询,还款操作提交到数据库,在开开心心下班前,突然心血来潮再次进行了查询账单操作,突然多了几条消费记录了,需要再次还款。A就感觉 提交事务前的查询有点幻读了,少了几条数据。

基于Spring中的事务@Transactional知识点有哪些

事务1在另一个事务提交后,再对同样的数据做修改 删除 新增操作。

基于Spring中的事务@Transactional知识点有哪些

---幻读,一般值的是新增;就是明明查询不到这条数据,去新增时会报错。

其实更新、删除也会有的,例如更新同一条用id+status去更新是,后提交的会更新失败,这一特性也可用来加锁,即CAS来更新数据,这样后操作的肯定就不会覆盖前面的数据了。

已经被删除的数据,此时去更新,也不会生效了,在这个事务内再次查询还是删除前的那个数据快照。

基于Spring中的事务@Transactional知识点有哪些

如果更新数据时只用id,存在并发修改的情况,那么后提交的必定覆盖之前事务的更新操作。比如本来数据的状态是1,事务2将数据状态有1->2,而事务1看的的状态还是1,事务1直接使用id更新的话,将数据的状态变成了3。事务1以为是1->3 ,其实是由 2->3,中间的状态2直接就被覆盖了。因此高并发的更新,需要慎重。

幻读总结: 很多对幻读的解释是,一个事务在查询的同时,另一个事务插入了数据,然后前一个事务再次查询就会发现多了几条数据,这个现象是不存在的,如果出现了,那说明当前的隔离级别是读已提交了。

可重复读中的就是说同一个事务了多次查询返回的数据肯定是一样的,这是毋庸置疑的,这也是与读已提交的区别。因此,只有在当前事务提交后,再次查询才会刷新到另一事务的改变。

那么我理解的幻读就是,在另一事务新增数据并提交后,此时的事务去新增同样一条数据,会报错的,而此时再去查询又是查无数据,这种现象才是幻读。

更新数据层面就是,事务2已经将数据的状态改变提交了,事务1用旧的状态作为条件去更新,影响行数会是0,这也是一种幻读。 更新已经被删除的数据,也是影响行数为0。

数据库最终的执行还是串行的,只是在前置的一些操作可以并发,最终更新到数据库,只能是有一条成功,由于一些规则的设置,就会出现上述的现象了。

4、串行化(没有并发操作)

串行化是最高的隔离级别,即事务排队串行执行了,没有了并发操作,也不会发生上述所说的脏读、不可重复读、幻读的现象,这个的使用场景不多,理解起来也较为的简单。

总结: 数据库的隔离级别就是一个事务内,对于另一事务的并发操作会有怎么样的效果;

  • 另一事务操作时就能看到修改后的数据,就是读未提交

  • 另一事务操作并提交后 能看到修改后的数据,就是读已提交

  • 另一事务操作提交后,当前事务依旧看不到相应的修改,事务开始什么数据,事务结束也是读取到同样的数据,就是可重复读

所有的事务都排队依次执行了,一次只能有一个进行修改,没有了并行,就是串行化

Spring事务隔离级别比数据库事务隔离级别多一个default

除了上述的四个隔离级别,多出来 DEFAULT (默认)这是一个PlatfromTransactionManager默认的隔离级别,即使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应,可以显性去指定其隔离级别。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

“基于Spring中的事务@Transactional知识点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于Spring中的事务@Transactional知识点有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于Spring中的事务@Transactional知识点有哪些

本篇内容介绍了“基于Spring中的事务@Transactional知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ACID,事务
2023-06-25

Spring事务的知识点有哪些

这篇文章主要介绍“Spring事务的知识点有哪些”,在日常操作中,相信很多人在Spring事务的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring事务的知识点有哪些”的疑惑有所帮助!接下来
2023-06-02

Spring的事件机制知识点有哪些

这篇文章主要讲解了“Spring的事件机制知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring的事件机制知识点有哪些”吧!同步事件和异步事件同步事件: 在一个线程里,按顺序
2023-06-22

Java中的基础知识点有哪些

这篇文章主要讲解了“Java中的基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的基础知识点有哪些”吧!"Hello World!"先来看一个HelloWorld.j
2023-06-02

HTML中有哪些基础知识点

本篇内容主要讲解“HTML中有哪些基础知识点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML中有哪些基础知识点”吧!一、 HTML的基本结构 网页的标题</</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-06-27</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="Css中基础知识点有哪些" href="/article/d161b661c9.html"><h4>Css中基础知识点有哪些</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2024-04-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="有哪些关于TypeScript的知识点" href="/article/5d89432272.html"><h4>有哪些关于TypeScript的知识点</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2024-04-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="Web的事件知识点有哪些" href="/article/4efb5830e5.html"><h4>Web的事件知识点有哪些</h4></a><div class="des">本篇内容主要讲解“Web的事件知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Web的事件知识点有哪些”吧!web中的事件事件并不是JavaScript的核心部分,他们是在浏览器的We</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-06-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="关于Java8的知识点有哪些" href="/article/fd1abe475c.html"><h4>关于Java8的知识点有哪些</h4></a><div class="des">这篇文章主要讲解了“关于Java8的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“关于Java8的知识点有哪些”吧!在了解一项新技术之前,我们需要了解我们为什么要去学习它以及它的</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-06-16</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="Golang中关于defer的知识点有哪些" href="/article/4ce3a9d735.html"><h4>Golang中关于defer的知识点有哪些</h4></a><div class="des">这篇文章主要介绍“Golang中关于defer的知识点有哪些”,在日常操作中,相信很多人在Golang中关于defer的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang中关于defer的</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-07-05</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="JavaScript事件的知识点有哪些" href="/article/caa0413d24.html"><h4>JavaScript事件的知识点有哪些</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2024-04-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="关于useState的知识点有哪些" href="/article/0b5b95f594.html"><h4>关于useState的知识点有哪些</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2024-04-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="MySql中索引、锁、事务知识点有哪些" href="/article/327a206247.html"><h4>MySql中索引、锁、事务知识点有哪些</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2024-04-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="CSS中Font的基本知识点有哪些" href="/article/3343916634.html"><h4>CSS中Font的基本知识点有哪些</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2024-04-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="SQLLite的基础知识点有哪些" href="/article/f00ffffab2.html"><h4>SQLLite的基础知识点有哪些</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2024-04-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="C++的基础知识点有哪些" href="/article/8d1f5188d0.html"><h4>C++的基础知识点有哪些</h4></a><div class="des">这篇文章主要介绍“C++的基础知识点有哪些”,在日常操作中,相信很多人在C++的基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的基础知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-06-17</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="Node.js的基础知识点有哪些" href="/article/10d30755a7.html"><h4>Node.js的基础知识点有哪些</h4></a><div class="des">这篇文章主要介绍“Node.js的基础知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js的基础知识点有哪些”文章能帮助大家解决问题。一、Node.js简介1.1什么是Node.</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-07-05</span></div><div class="clearboth"></div></div></div></div><div class="hotFlag"><h4>热门标签</h4><div class="flagBox"><a title="Linux" href="/tag/Linux/">Linux(148)</a><a title="PHP" href="/tag/PHP/">PHP(127)</a><a title="Java" href="/tag/Java/">Java(102)</a><a title="正则表达式" href="/tag/正则表达式/">正则表达式(101)</a><a title="JavaScript" href="/tag/JavaScript/">JavaScript(69)</a><a title="最佳实践" href="/tag/最佳实践/">最佳实践(67)</a><a title="jQuery" href="/tag/jQuery/">jQuery(44)</a><a title="MySQL" href="/tag/MySQL/">MySQL(39)</a><a title="Docker" href="/tag/Docker/">Docker(37)</a><a title="C语言" href="/tag/C语言/">C语言(36)</a><a title="性能优化" href="/tag/性能优化/">性能优化(34)</a><a title="Python" href="/tag/Python/">Python(34)</a><a title="XML" href="/tag/XML/">XML(28)</a><a title="string" href="/tag/string/">string(27)</a><a title="第三方库" href="/tag/第三方库/">第三方库(23)</a><a title="回调函数" href="/tag/回调函数/">回调函数(23)</a><a title="ZIP" href="/tag/ZIP/">ZIP(22)</a><a title="数组" href="/tag/数组/">数组(22)</a><a title="可扩展性" href="/tag/可扩展性/">可扩展性(22)</a><a title="字符串比较" href="/tag/字符串比较/">字符串比较(21)</a><a title="find" href="/tag/find/">find(20)</a><a title="RPM" href="/tag/RPM/">RPM(20)</a><a title="Go" href="/tag/Go/">Go(20)</a><a title="grep" href="/tag/grep/">grep(19)</a><a title="ASP.NETCore" href="/tag/ASP.NETCore/">ASP.NETCore(19)</a><a title="XML解析器" href="/tag/XML解析器/">XML解析器(19)</a><a title="事件" href="/tag/事件/">事件(19)</a><a title="事件处理程序" href="/tag/事件处理程序/">事件处理程序(19)</a><a title="StringBuilder" href="/tag/StringBuilder/">StringBuilder(18)</a><a title="Nginx" href="/tag/Nginx/">Nginx(18)</a></div></div></div><div class="main_right fr"><div class="artHotSearch"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_rs"></span><span class="name">编程热搜</span></div><a href="" class="fr bg_content bg_txt_rsb"></a><div class="clearboth"></div></h4><ul><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python 学习之路 - Python" href="https://www.528045.com/article/52df4d95aa.html">Python 学习之路 - Python</a></span></h5><div class="clearboth"></div><div class="des">一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-</div></div><img class="lazy" data-type="0" data-src="/file/imgs/upload/202301/31/qglhspth11k.jpg" alt="Python 学习之路 - Python" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="chatgpt的中文全称是什么" href="https://www.528045.com/article/6d32547808.html">chatgpt的中文全称是什么</a></span></h5><div class="clearboth"></div><div class="des">chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列</div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/34.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="chatgpt的中文全称是什么" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="C/C++中extern函数使用详解" href="https://www.528045.com/article/9733fb00d0.html">C/C++中extern函数使用详解</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/file/upload/202211/13/d3kqhimmpgl.jpg" alt="C/C++中extern函数使用详解" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="C/C++可变参数的使用" href="https://www.528045.com/article/773997944a.html">C/C++可变参数的使用</a></span></h5><div class="clearboth"></div><div class="des">可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃</div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/55.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="C/C++可变参数的使用" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="css样式文件该放在哪里" href="https://www.528045.com/article/617e4312cb.html">css样式文件该放在哪里</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/7.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="css样式文件该放在哪里" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="php中数组下标必须是连续的吗" href="https://www.528045.com/article/21ee165f7c.html">php中数组下标必须是连续的吗</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/upload/jz5euwde0tq.jpg" alt="php中数组下标必须是连续的吗" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python 3 教程" href="https://www.528045.com/article/01a1d65257.html">Python 3 教程</a></span></h5><div class="clearboth"></div><div class="des">Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python</div></div><img class="lazy" data-type="0" data-src="/upload/202205/01/jneowzxxjtt.jpg" alt="Python 3 教程" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python pip包管理" href="https://www.528045.com/article/ab7f357e04.html">Python pip包管理</a></span></h5><div class="clearboth"></div><div class="des">一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    </div></div><img class="lazy" data-type="0" data-src="/file/imgs/upload/202301/31/qn4pmgvm0lq.jpg" alt="Python pip包管理" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="ubuntu如何重新编译内核" href="https://www.528045.com/article/a65a3a171f.html">ubuntu如何重新编译内核</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/file/uploads/202210/26/1sph0pw5wqc.jpg" alt="ubuntu如何重新编译内核" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="改善Java代码之慎用java动态编译" href="https://www.528045.com/article/d085d3bcbe.html">改善Java代码之慎用java动态编译</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/59.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="改善Java代码之慎用java动态编译" /><div class="clearboth"></div></li></ul><div class="seeMore"><a href="https://www.528045.com/article/program-c4-1.html">查看更多</a></div></div><div class="artSubmit"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_yktg"></span><span class="name">编程资源站</span></div><div class="clearboth"></div></h4><ul class="submitNav clearfix"><li class="active first">资料下载</li><li>历年试题</li></ul><div class="submitBox active"><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级信息系统项目管理师高频考点" href="https://www.528045.com/down/89bb6.html">2021年下半年软考高级信息系统项目管理师高频考点</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统技术知识点记忆口诀" href="https://www.528045.com/down/7d690.html">2021下半年软考高级信息系统技术知识点记忆口诀</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考《信息系统项目管理师》考试真题及答案" href="https://www.528045.com/down/4277a.html">2021下半年软考《信息系统项目管理师》考试真题及答案</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级考试备考攻略" href="https://www.528045.com/down/9248a.html">2021下半年软考高级考试备考攻略</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年软考高级《信息系统项目管理师》巩固练习题汇总" href="https://www.528045.com/down/fcca0.html">2021年软考高级《信息系统项目管理师》巩固练习题汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统项目管理师30个易考知识点汇总" href="https://www.528045.com/down/7636b.html">2021下半年软考高级信息系统项目管理师30个易考知识点汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级知识点这样记,还担心记不住吗" href="https://www.528045.com/down/76382.html">2021下半年软考高级知识点这样记,还担心记不住吗</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级考试重点汇总" href="https://www.528045.com/down/15f44.html">2021年下半年软考高级考试重点汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统项目管理师计算公式汇总" href="https://www.528045.com/down/2d560.html">2021下半年软考高级信息系统项目管理师计算公式汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级《信息系统项目管理师》模拟试题" href="https://www.528045.com/down/c0085.html">2021年下半年软考高级《信息系统项目管理师》模拟试题</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="seeMore"><a href="/down/">查看更多</a></div></div><div class="submitBox"><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="信息系统项目管理师选择题每日一练(2024)" href="https://www.528045.com/article/6d5f303202.html">信息系统项目管理师选择题每日一练(2024)</a><span class="hot"><a href="https://www.528045.com/article/lnst-c57-1.html">历年试题</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2023年下半年信息系统项目管理师综合知识真题演练" href="https://www.528045.com/article/f2da969d4f.html">2023年下半年信息系统项目管理师综合知识真题演练</a><span class="hot"><a href="https://www.528045.com/article/lnst-c57-1.html">历年试题</a></span></h5></div><div class="seeMore"><a href="https://www.528045.com/article/lnst-c57-1.html">查看更多</a></div></div></div><div class="meumfie"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_ykzl"></span><span class="name">目录</span></div><div class="clearboth"></div></h4><div class="toc"></div></div></div><div class="clearboth"></div></div><script type="text/javascript" src="/skin/static/js/toc.js"></script><div class="popUp popDelay"><div class="maskBg"></div><div class="popCon"><span class="btn btn_close"></span><div class="tip"> 本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页 </div><div class="delayMain"><div class="delaymain_left"><a href="https://www.528045.com"><img src="https://static.528045.com/skin/content_left.png?imageMogr2/format/webp/blur/1x0/quality/35"></a></div><div class="delaymain_right"><div class="news_title"><span class="fl">最新资讯</span ><a href="/" class="fr">更多</a><div class="clearboth"></div></div><ul></ul></div><div class="clearboth"></div></div><div class="bigshow"><a href="https://www.528045.com"><img src="https://static.528045.com/skin/content_bottom.png?imageMogr2/format/webp/blur/1x0/quality/35"></a></div></div></div><div class="footer"><div class="friendLink"><span class="friendTitle">友情链接</span><a href="https://www.lsjlt.com">编程网</a></div><script type="text/javascript" src="/skin/static/js/footermain.js"></script></div><div class="popCommon"><span class="mask"></span><div class="popCon"></div></div><div class="ajaxrightbtn"><div class="funBtnbox"><div class="rb_fk rb_ty br_bom"><div class="wx_mo1 _mo1"><i class="dtmuban-iconfont icon-fankui2"></i><p>反馈</p></div><a href="javascript:void(0);" onclick="Dsb('urs-form-modalfk');"><div class="_mo2 rb_gradient br_bom"><p>我要<br>反馈</p></div></a></div></div><div class="fbs fbs-gotp back2top" style="display: none;"><div class="rb_top rb_ty br_all"><div class="top_mo1 _mo1 "><i class="dtmuban-iconfont icon-zhiding"></i></div><a href="javascript:void(0);" title="返回顶部"><div class="_mo2 rb_gradient br_all"><p>返回<br>顶部</p></div></a></div></div></div><div id="urs-form-modalfk-bg" class="urs-form-modal-bg" style="display: none;"></div><div id="urs-form-modalfk" class="urs-form-modal" style="display: none;"><div class="urs-form-component plan-get-form-mini js-apply-form clearfix"><div class="urs-component-head"><div class="icon-close" onclick="Dhb('urs-form-modalfk');"><img id="close-btn" src="https://static.528045.com/skin/ic_delete_normal_24px.png"></div><p class="form-title">留言反馈</p><p></p><p class="form-line"></p></div><div class="urs-component-tab"><h5>感谢您的提交,我们服务专员将在<span>30分钟内</span>给您回复</h5><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-fanganguihua"></i><input class="u-input js-apply-phone" type="text" id="titleb" name="titleb" value="我要反馈留言,看到请回复" placeholder="留言标题"><span id="dtitlea"></span></div><div class="get-plan-form-item"><select name="typeidb" id="typeidb" class="u-select"><option value="">请选择类型</option><option value="0">问题反馈</option><option value="1">意见建议</option><option value="2">倒卖举报</option><option value="3">不良信息</option><option value="4">其他</option></select></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-yonghu"></i><input class="u-input js-apply-name" type="text" id="truenameb" name="truenameb" placeholder="您的姓名" value=""><span id="dtruenameb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-liuyan"></i><input class="u-input js-apply-phone" type="text" id="emailb" name="emailb" placeholder="您的邮箱" value=""><span id="demailb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-shouji"></i><input class="u-input js-apply-phone" type="text" id="telephoneb" name="telephoneb" placeholder="您的手机" value=""><span id="dtelephoneb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-liuyan2"></i><textarea class="u-textarea js-apply-content" id="contentb" name="contentb" placeholder="留言说明,文字为2-100字" value=""></textarea><span id="dcontentb"></span></div><button type="submit" name="submit" class="btn btn-red" onclick="checkaguestbook();">立即提交</button></div></div></div><style> .drop_more li{ list-style: none;} </style><script type="text/javascript" src="/file/script/config.js"></script><script type="text/javascript" src="/file/script/common.js"></script><script type="text/javascript" src="/skin/static/js/commonpop.js"></script><script type="text/javascript" src="/skin/static/js/header.js"></script><script type="text/javascript" src="/skin/static/js/footer.js"></script><script type="text/javascript" src="/skin/static/js/listconcommon.js"></script><script src="/skin/static/layui/layui.js" type="text/javascript"></script><script src="/skin/static/js/custom-script.js" type="text/javascript"></script><script src="/skin/static/js/indexsms.js?v=20240108.1443"></script><script type="text/javascript"> $(function(){ var destoon_userid = 0,destoon_username = '',destoon_member = destoon_guest = ''; destoon_guest = '<div class="login-li"><a href="javascript:void(0);" lay-on="showLoginPopup" class="a_on_dl" id="dn-login">请登录</a></div><div class="login-li"><a href="javascript:void(0);" lay-on="showLoginPopup" class="a_to">免费注册</a></div>'; destoon_member += destoon_guest; $('#m52_member').html(destoon_member); }); </script></body></html><script type="text/javascript" src="/skin/static/js/contentie.js"></script>