高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战案例全网唯一

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战

前言

笔者我实际工作中,经常遇到mysql数据库死锁问题!CSDN上面也有很多大神刨析解决方法!
我在实际工作中的MySQL数据库架构很复杂,又涉及到主从多副本集群,又涉及到多个java进程进行并发级联更新操作!遇到死锁问题根本来说不能完全的避免!
我就讲讲我实际的解决思路与方法吧!

java 日志如下:

com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3461)
	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459)
	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459)
	at com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:660)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459)
	at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:167)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:497)

一、mysql死锁是怎么造成的?

MySQL 死锁通常由以下原因造成:

  1. 资源竞争:多个事务同时竞争相同的资源,比如都试图获取对方持有的锁。
  2. 循环等待:事务之间形成了一种互相等待对方释放资源的循环关系。
  3. 不当的事务设计:事务执行顺序不合理、执行时间过长等。
  4. 并发操作冲突:在高并发环境下,多个事务对同一组数据进行操作,容易引发锁冲突导致死锁。
  5. 索引使用不当:如果索引设计不合理,可能导致事务在获取锁时出现问题。

例如,事务 A 锁住了表中的一行,然后尝试对另一行加锁;同时事务 B 锁住了事务 A 想要加锁的第二行,并尝试对事务 A 锁住的第一行加锁,这样就形成了死锁。

为了避免死锁,可以合理设计事务、优化索引、尽量减少事务的阻塞时间、调整数据库配置参数等。

MySQL中的死锁是指两个或多个事务在同一时间等待对方释放锁,从而导致彼此都无法继续执行的情况。这种现象常见于并发环境中,尤其是在事务处理过程中涉及到多个资源锁定时。下面是造成MySQL死锁的一些主要原因:

  1. 循环等待资源:当两个或多个事务分别锁定了对方需要的资源,形成一个“锁等待循环”,就会产生死锁。例如,事务A锁定了资源1并等待资源2,而事务B锁定了资源2并等待资源1,这样双方都在等待对方释放锁,形成死锁。

  2. 并发更新同一行或多行数据:如果两个事务同时尝试更新同一行数据,并且每个事务都为更新操作申请了排他锁(写锁),那么先获得锁的事务会阻塞后来的事务,如果这些事务按照某种顺序相互等待,就会产生死锁。

  3. 事务持锁时间过长:长时间持有锁的事务可能导致其他事务等待,增加死锁的风险。特别是在事务中包含大量操作或者执行耗时较长的查询时,更容易引发死锁。

  4. 不恰当的锁顺序:如果多个事务按照不同的顺序锁定资源,可能会导致死锁。例如,如果一部分事务总是先锁表A后锁表B,而另一部分事务则是先锁表B后锁表A,那么在某些并发场景下可能发生死锁。

  5. 批量操作与逐行处理冲突:在批量更新或删除数据时,如果其中某条记录正被另一个事务锁定,而该批量操作又在一个事务中进行,可能导致整个批次等待,与其他持有锁的事务形成死锁。

  6. 索引和锁粒度:不恰当的索引设计或锁粒度过大会增加死锁的可能性。例如,如果锁住的是范围(如间隙锁),而不是单一的行,可能会无意中锁住其他事务需要的资源。

解决死锁通常需要采取一些策略,比如设置合理的事务隔离级别、优化事务逻辑减少锁的持有时间、按同一顺序锁定资源、使用死锁检测和自动解决机制(MySQL默认开启死锁检测并自动回滚持有最少行级锁的事务)等。

死锁的产生通常需要满足以下四个条件:

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源,在未使用完之前,不能被剥夺。
  4. 环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

在 Java 中,即使你去掉了事务注解并让 MySQL 自动提交,仍然可能出现死锁的原因有以下几点:
5. 并发操作:如果多个线程或进程同时访问和修改数据库中的数据,可能会导致死锁。例如,两个线程都需要获取两个不同的资源,但是它们获取资源的顺序不同,就可能会导致死锁。
6. 资源竞争:当多个事务或线程同时竞争同一资源时,也可能会导致死锁。例如,两个事务都需要更新同一行数据,但是它们的执行顺序不同,就可能会导致死锁。
7. 数据库设计:如果数据库设计不合理,例如存在过多的关联和约束,也可能会导致死锁。
8. MySQL 内部机制:MySQL 内部的一些机制,例如锁等待超时、死锁检测等,也可能会导致死锁。

为了避免死锁,可以采取以下措施:
9. 优化数据库设计:合理设计数据库,减少关联和约束,避免过多的并发操作。
10. 添加合适的索引:为经常用于查询、连接和排序的字段添加索引,以提高数据库的查询效率。
11. 调整事务隔离级别:根据实际需求,调整事务的隔离级别,避免过高的隔离级别导致死锁。
12. 避免长事务:尽量减少事务的执行时间,避免长时间占用资源。
13. 按照相同的顺序访问资源:多个线程或进程按照相同的顺序访问资源,可以避免死锁的发生。
14. 使用超时机制:设置合理的超时时间,避免线程或进程长时间等待资源。
15. 监控和分析死锁:定期监控数据库的死锁情况,分析死锁的原因,并采取相应的措施进行优化。

连带问题:MYSQL的一个更新语句的事务提交是不是也需要时间?

是的,MySQL中的一个更新语句执行时,如果该操作是在事务中进行的,事务的提交确实需要时间。这个时间包括但不限于以下几个步骤:

  1. 执行更新操作:首先,数据库引擎(如InnoDB)需要执行更新语句,修改数据行的内容。这包括查找数据、更新索引、修改数据行等操作。

  2. 记录redo log(重做日志):InnoDB引擎会记录关于数据更改的日志,这称为redo log。即使在事务还没提交前,这部分日志也会被立即写入磁盘或缓存(取决于配置),确保事务的持久性。

  3. 记录undo log(回滚日志):同时,数据库还会记录undo log,以便在事务回滚时恢复原始数据状态或提供多版本并发控制(MVCC)的支持。

  4. 事务提交处理:当调用COMMIT时,数据库会执行一系列操作来完成事务,包括但不限于标记事务状态为已提交、释放锁、持久化事务状态到事务日志(如binlog)等。

  5. 刷盘确认:确保事务的持久化,相关日志和数据变更需要从内存刷到磁盘。根据MySQL的配置(如innodb_flush_log_at_trx_commit参数),这可能即时发生,也可能稍微延后,但会保证在事务提交后尽快完成。

因此,事务提交的时间取决于上述操作的执行效率,包括I/O速度、数据库负载、硬件性能、日志同步策略等因素。在低负载和良好配置的系统上,这个过程可能只需要几毫秒;而在高负载或I/O受限的环境中,可能需要更长时间,甚至导致性能瓶颈。

二、解决思路调整事务层级

在 Java 中,通过Connection对象的setTransactionIsolation()方法可以设置以下事务隔离级别:

  • TRANSACTION_NONE:JDBC 驱动不支持事务。
  • TRANSACTION_READ_UNCOMMITTED:允许脏读、不可重复读和幻读。
  • TRANSACTION_READ_COMMITTED:禁止脏读,但允许不可重复读和幻读。
  • TRANSACTION_REPEATABLE_READ:禁止脏读和不可重复读,但允许幻读。
  • TRANSACTION_SERIALIZABLE:禁止脏读、不可重复读和幻读。

事务隔离级别越高,数据的一致性和可靠性就越高,但同时也会增加系统的开销和性能的影响。因此,在实际应用中,需要根据具体的业务需求和性能要求来选择合适的事务隔离级别。
以下是对这些概念的详细解释:

脏读:脏读是指一个事务读取到了另一个事务未提交的数据。比如事务 A 修改了一条数据但还未提交,此时事务 B 读取到了这个被修改但未提交的数据,如果事务 A 后续回滚了,那么事务 B 读取到的数据就是无效的、“脏”的数据。

不可重复读:是指在一个事务内,多次读取同一行数据时,得到的结果不同。这可能是因为在该事务执行过程中,其他事务对这行数据进行了修改并提交。

幻读:幻读主要体现在当一个事务在基于某个条件进行查询时,在两次查询的间隔期间,另一个事务插入或删除了符合该条件的数据,导致两次查询的结果集不同。例如事务 A 第一次查询得到了一些数据,然后事务 B 插入了一些新的数据,当事务 A 再次按照同样条件查询时,出现了之前没有的新数据,就好像出现了“幻觉”一样。

以下是一些可能的改进措施:

  1. 设置合适的事务隔离级别:确保事务隔离级别与业务需求相符,避免不必要的锁冲突。可以尝试将隔离级别设置为 TRANSACTION_READ_COMMITTED 等。
  2. 优化 SQL 语句:检查执行的 SQL 语句是否存在不合理的设计或可以优化的地方,减少资源竞争。
  3. 添加事务超时机制:设置一个合理的事务超时时间,避免长时间持有锁导致死锁。
  4. 调整业务逻辑:分析业务流程,看是否可以通过调整执行顺序或其他方式来降低死锁的可能性。
  5. 使用数据库连接池:确保连接池配置合理,有效管理数据库连接。
  6. 增加锁等待超时处理:在遇到锁等待时,添加超时处理逻辑,而不是一直等待导致死锁。
  7. 监控和分析:建立数据库监控机制,及时发现和分析死锁情况,以便针对性地进行改进。

具体的改进方式需要根据实际情况进行综合考虑和调整。

要在 Spring Boot 中配置 MySQL 8 的事务隔离级别,可以通过spring.datasource.druid属性来进行设置。以下是一个示例配置:

# 设置事务隔离级别为 READ_COMMITTED
spring.datasource.druid.transaction-isolation-level=READ_COMMITTED

在上述配置中,将spring.datasource.druid.transaction-isolation-level属性设置为READ_COMMITTED,表示将事务隔离级别设置为读已提交。你可以根据需要将其设置为其他事务隔离级别,例如REPEATABLE_READSERIALIZABLE

请注意,确保你的 MySQL 数据库服务器实际支持所配置的事务隔离级别。此外,还需要根据你的具体应用需求和数据库设计来选择合适的事务隔离级别。

另外,如果你使用的是其他数据源或连接池,可能需要参考相应的文档来了解如何设置事务隔离级别。

笔者亲自调高了Java程序的事务级别,但是问题还存在!

笔者没有调整mysql的公共的事务层级,怕出生产问题!

MySQL 8 的默认事务隔离级别为REPEATABLE-READ(可重复读)。

可以通过以下 SQL 语句查看当前会话或全局的事务隔离级别:

  • 查看当前会话的事务隔离级别:
SELECT @@transaction_isolation;
  • 查看全局的事务隔离级别:
SELECT @@global.transaction_isolation;

如果需要修改事务隔离级别,可以使用以下 SQL 语句:

  • 设置当前会话的事务隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE;
  • 设置全局的事务隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE;

请注意,不同的数据库连接池或框架可能会有不同的设置方式,上述示例是针对 MySQL 数据库的常见设置方法。在实际应用中,需要根据具体情况选择合适的事务隔离级别,并确保在事务中正确处理数据的一致性和并发问题。

三、补漏执行机制解决思路(上线可行性方案)

上述的真正生产情况,非常复杂,引起死锁的可能性,跟不空因素太多了,而且调整mysql数据库的事务层级,也可能会引起新的问题!主要是笔者这个是多个主从集群,还主从同步很多表!太复杂了!
保守方案就是重复执行,如果遇到MySQLTransactionRollbackException异常,捕获异常,连续执行几次!直到执行成功!

(一)Java代码调度案例

public int execSourceDBSqlWithManualTransaction(String sql) {
    int i = 0;
    int retryTimes = 0;
    while (true) {
        TransactionStatus status = null;
        try (TransactionTemplate transactionTemplate = new TransactionTemplate(Mapper.getTransactionManager())) {
            status = transactionTemplate.execute(new TransactionCallback<Void>() {
                @Override
                public Void doInTransaction(TransactionStatus transactionStatus) {
                    try {
                        i = Mapper.execSql(sql);
                    } catch (Exception e) {
                        if (e instanceof com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException && ((com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException) e).getMessage().contains("Deadlock found when trying to get lock; try restarting transaction")) {
                           
                            Logger.info("【ERROR】【execSql】执行 SQL:【" + sql + "】出现死锁,准备重试!");
                            continue;
                        } else {
                            
                            Logger.info("【ERROR】【execDBSql】执行 SQL:【" + sql + "】出现数据库错误!");
                           
                        }
                    }
                    return null;
                }
            });
        }
        if (status.isCompleted()) {
            // 提交成功
            break;
        }
        retryTimes++;
        if (retryTimes > 10) { // 设置一个合理的最大重试次数
            Logger.error("【ERROR】【execSourceDBSql】执行 SQL:【" + sql + "】多次重试后仍失败!");
            break;
        }
    }
    return i;
}

(二)Spring的@Retryable注解补漏调度机制

import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.transaction.annotation.Transactional;

@Service
public class YourService {

    @Transactional
    @Retryable(value = MySQLTransactionRollbackException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000))
    public int execSourceDBSqlWithRetry(String sql) {
        try {
            int result = Mapper.execSql(sql);
            // 确保事务提交,可以通过在finally块中添加一个显式的flush和commit操作,
            // 但实际上在Spring中,如果方法结束且没有抛出异常,事务会自动提交。
            // 这里不需要额外操作,因为我们依赖Spring的事务管理。
            return result;
        } catch (Exception e) {
            // 记录错误逻辑保持不变
            ErrorSqlRecord.getErrsql_list().add(sql);
            Logger.info("【ERROR】【execSourceDBSqlWithRetry】执行SQL:【" + sql + "】出现数据库错误!");
      
            throw e; // 重新抛出异常以便触发重试
        }
    }

    // 重试结束后恢复方法,当达到最大重试次数后执行
    @Recover
    public int recover(MySQLTransactionRollbackException ex, String sql) {
        Logger.error("【RETRY FAILED】【execSourceDBSqlWithRetry】执行SQL:【" + sql + "】重试3次后仍失败!");
        // 根据需要处理最终失败的情况,比如记录日志或发送告警
        return -1; // 或者其他表示失败的返回值
    }
}

总结一下,算法代码调度,补漏的算法机制,确定语句是执行成功的,如果执行失败了,就重复执行,直到成功! 完全避免死锁,笔者在实际工作中觉得不大现实!因为不可控制的因素太多了!我个人觉得这种方案的可靠性比较强!安全性比较高!事故率低,也就是占更多时间资源!

我们每个开发人员,技术体系也是局限的,比如JAVA工程师比较熟悉程序调度,DBA管理员就比较熟悉数据库运作,但是要做到全部精通,全栈全懂,其实现实中没有这么完美的研发工程师!就算是技术总监也许更擅长架构设计!具体的实际问题也得实际有经验的研发解决!

全栈不存在,完美的人也不存在!完美的项目,完美的代码,完美的世界都不存在,接受不完美吧!

笔者简介
国内某一线知名软件公司企业认证在职员工:任JAVA高级研发工程师,大数据领域专家,数据库领域专家兼任高级DBA!10年软件开发经验!现任国内某大型软件公司大数据研发工程师、MySQL数据库DBA,软件架构师。直接参与设计国家级亿级别大数据项目!并维护真实企业级生产数据库300余个!紧急处理数据库生产事故上百起,挽回数据丢失所造成的灾难损失不计其数!并为某国家级大数据系统的技术方案(国家知识产权局颁布)专利权的第一专利发明人!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「异步魔法:Python数据库交互的革命」(一)

Hi&#xff0c;我是阿佑&#xff0c;今天将和大家一块打开异步魔法的大门&#xff0c;进入Python异步编程的神秘领域&#xff0c;学习如何同时施展多个咒语而不需等待。了解asyncio的魔力&#xff0c;掌握Async SQLAlchemy和Tortoise-ORM的秘密&#xff0c;让你的数据库操作快如…

Linux新增磁盘挂载分区

1. 查看磁盘分区名称 lsblk 可见&#xff0c;新增的分区为 sdb 2.格式化磁盘 mkfs.xfs -f /dev/sdb 3.挂在磁盘到 /ocean目录&#xff0c;挂在前先创建空目录 /ocean mkdir /oceanmount /dev/sdb /ocean 执行后&#xff0c;可用 df -h 查看分区是否成功 4.持久化磁盘分区&a…

如何让物理服务器可以运行多个虚拟机:VMware ESXi系统安装-详细介绍

目录 一、虚拟机&#xff08;比如VMware ESXi上的虚拟机&#xff09;及其优势 &#xff08;一&#xff09;虚拟机 &#xff08;二&#xff09;虚拟机应用和优势 1、硬件资源利用率提升 2、灵活性和可扩展性 3、高可用性 4、简化管理 5、绿色节能 6、快速响应业务需求 …

应用案例|精密制造中使用复合机器人得到显著提升

精密制造行业对设备的精度、稳定性和效率要求极高&#xff0c;而复合机器人凭借其多功能性、高度灵活性和精准控制能力&#xff0c;正逐渐成为该领域的新宠。以下是一个富唯智能复合机器人在精密制造中的应用案例。 案例背景 某知名汽车零部件制造企业&#xff0c;专注于生产…

【好书分享第十三期】AI数据处理实战108招:ChatGPT+Excel+VBA

文章目录 一、内容介绍二、内页插图三、作者简介四、前言/序言五、目录 一、内容介绍 《AI数据处理实战108招&#xff1a;ChatGPTExcelVBA》通过7个专题内容、108个实用技巧&#xff0c;讲解了如何运用ChatGPT结合办公软件Excel和VBA代码实现AI办公智能化、高效化。随书附赠了…

基于微信小程序开发的一款 高颜值在线答题刷题考试程序

大家好&#xff0c;我是兔兔。今天给大家分享的内容是&#xff0c;兔兔答题模板三的发布。 兔兔答题模板三是一款基于uniapp开发&#xff0c;后端使用PHP&#xff0c;前端使用图鸟UI的微信答题小程序应用程序。相必兔兔答题模板一和兔兔答题模板二&#xff0c;进行了系统架构的…

《Ai企业知识库》rasa-rasa Core核心-认知理解以及配置文件应用

阿丹&#xff1a; 其实在整个rasa中的关键元素和关键的核心在前面多多少少也涉及到了很多&#xff0c;这里就是开始涉及到了rasa的训练核心core。 Rasa Core: Rasa Core 是Rasa框架中的一个组件&#xff0c;它负责处理对话管理部分&#xff0c;即决定对话流程中机器人的下一步…

IPV4地址介绍

4.1IP地址简介 目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中网络层的协议&#xff0c;是TCP/IP协议族的核心协议。IP协议定义了一种地址编码&#xff0c;称为IP地址&#xff0c;它是网络中网络段、网络设备接口、主机的编码&#xff0c;它并不是一种物理…

容器化部署gitlab、jenkins,jenkins应用示例

一、容器化部署docker和docker conpose安装 Docker&Docker-compose的安装及部署_docker 20 使用什么版本docker-compose-CSDN博客 1.docker 安装脚本 cat >01_docker.sh<<EOF #!/bin/bash yum remove docker \docker-client \docker-client-latest \docker-co…

组件的传参等

一:组件的生命周期函数 组件的生命周期函数: created只是创建了组件内的实例对象 attached,给组件实例绑定了属性,绑定到页面节点树之后 ready准备好渲染之后,还未渲染之前 moved组件实例被移动到另一个位置后执行 detached在整个组件被被移除执行 error执行的时候,组件内…

接口的扩展方法 注意点

只把必备的契约定义在接口中&#xff0c;把其他功能留给扩展方法去实现 定义接口的时候&#xff0c;只把必备的功能列出来就行了&#xff0c;而其他一些功能则可以在别的类里面以扩展方法的形式去编写&#xff0c;那些方法能够借助原接口所定义的基本功能来完成自身的任务。 这…

Stable Diffusion WebUI详细使用指南

Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…

php 安装 swoole扩展

一 在swoole官网查询适配版本Swoole 文档 2. php环境为7.3下载 4.8 ​ wget https://pecl.php.net/get/swoole-4.6.6.tgztar -zxvf swoole-4.6.6.tgzcd swoole-4.6.6/usr/local/php7/bin/phpize​ ./configure --enable-openssl --enable-sockets --enable-mysqlnd --enabl…

Downie 4 for Mac:视频下载的新选择

对于Mac用户来说&#xff0c;想要轻松下载网上的视频内容&#xff0c;Downie 4无疑是一个绝佳的选择。这款专为Mac打造的视频下载工具&#xff0c;凭借其强大的功能和简洁的操作界面&#xff0c;让视频下载变得轻松又高效。 Downie 4支持从众多网站下载视频&#xff0c;包括各…

斯坦福报告解读4:图解有趣的推理基准(中)

《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika等人员和组织合著&#xff0c;该报告已被公认为最权威、最具信誉人工智能数据与洞察来源之一。 2024年版《人工智能指数报告》是迄今为止最为详尽的一份…

逍遥散人的“痛婚”,让《光夜》玩家悄悄破防了

网红博主的一场求婚&#xff0c;让《光与夜之恋》玩家破防了。 知名游戏博主逍遥散人发微博公布求婚成功&#xff0c;本来应该是一件喜事&#xff0c;但却因为求婚场景布满了《光与夜之恋》男主角之一陆沉的谷子&#xff08;周边&#xff09;&#xff0c;遭到了“6推”&#x…

AI知识库和Agent简介及实现

AI知识库和Agent简介及实现 引言 随着人工智能的发展&#xff0c;大规模预训练模型&#xff08;Large Pre-trained Models&#xff0c;简称大模型&#xff09;成为了AI领域的重要研究方向。大模型通过大量的数据训练&#xff0c;能够在各种任务中展现出强大的性能。本文将重点…

出租房水电抄表系统的全面解析

1.系统定义和功能 出租房水电抄表系统是一种智能的可视化工具&#xff0c;关键用于解决房东在经营好几个出租房源时&#xff0c;对水电的使用量统计分析、收费和管理上的问题。通过自动化抄表、收费和通告&#xff0c;此系统减轻了房东的工作负担&#xff0c;提高了效率&#…

深入理解统计学中的最大值与最小值

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、统计学中的基础概念&#xff1a;最大值与最小值 1. 创建数组与数据导入 2. 求解整体数…

电表自动抄表系统:智能时代的能源管理新方式

1.界定和功能 电表自动抄表系统是一种现代化电力计量技术&#xff0c;它利用先进的通讯技术和互联网&#xff0c;完成了远程控制、实时电磁能数据采集和处理。系统的主要作用包含全自动载入电表数据信息、实时检测电力应用情况、出现异常报案及其形成详尽能源使用报告&#xf…