【MySQL】C语言连接MySQL数据库3——事务操作和错误处理API

目录

1.MySQL事务处理机制

1.1.autocommit

1.2.autocommit的设置与查看

1.3.使用示例

2.事务操作API

2.1.设置事务提交模式——mysql_autocommit()

 2.2.提交事务——mysql_commit()

2.3.事务回滚——mysql_rollback()

3.错误处理的API

3.1.返回错误的描述——mysql_error()

3.2.返回错误的编号——mysql_errno()


 

1.MySQL事务处理机制

1.1.autocommit

        默认情况下, MySQL启用自动提交模式(变量autocommit为ON)。这意味着,只要你执行DML操作的语句,MySQL会立即隐式提交事务(Implicit Commit)

        在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。

在MySQL的InnoDB存储引擎中,事务的处理方式主要由autocommit参数来决定。该参数能够设定事务是自动提交还是手动提交。

1. 当autocommit=0时(手动提交模式)

  • 事务启动:一旦用户对数据进行操作(例如INSERT、UPDATE或DELETE等修改数据的SQL语句),事务将自动开始。
  • 事务提交:用户需要明确执行COMMIT命令来提交事务,从而确保所有更改都被永久保存到数据库中。若不执行commit命令,系统则默认事务回滚。
  • 事务周期:从事务开始到用户执行COMMIT命令之间的所有数据库操作,都被视为一个完整的事务周期。
  • 事务回滚:如果用户在事务期间未执行COMMIT命令,而是执行了ROLLBACK命令,或者由于某些错误导致事务中断,那么事务中的所有更改都将被撤销。

需要特别注意的是,在autocommit=0模式下,如果用户未执行COMMIT或ROLLBACK命令就关闭了数据库连接,那么MySQL会根据当前会话的autocommit设置和是否遇到了错误来决定是否自动回滚事务。然而,为了确保数据的一致性,通常建议用户明确执行COMMIT或ROLLBACK命令。

2. 当autocommit=1时(自动提交模式,系统默认值)

  • 自动提交:如果用户没有使用START TRANSACTION或BEGIN命令来显式地启动一个事务,那么MySQL会将每个独立的SQL语句视为一个单独的事务,并在该语句执行后立即提交。
  • 手动提交:尽管autocommit的默认值是1,但用户仍然可以通过执行START TRANSACTION或BEGIN命令来显式地启动一个事务,并在完成所有操作后执行COMMIT命令来提交事务。
  • 事务周期
    • 在没有显式启动事务的情况下,每个SQL语句都是一个独立的事务周期。
    • 在显式启动事务的情况下,从START TRANSACTION或BEGIN到COMMIT或ROLLBACK之间的所有操作为一个完整的事务周期。

注意:autocommit 设置只针对删除(DELETE)、插入(INSERT)、修改(UPDATE)这类会改变数据库中数据的操作,而不包括查询(SELECT)操作。

        在MySQL中,autocommit 是一个会话级别的变量,用于控制是否自动提交事务。当 autocommit 设置为 ON 时,每个独立的DML操作(如INSERT、UPDATE、DELETE)都会被当作一个事务并自动提交。这意味着,每执行一个这样的操作,MySQL都会立即将其更

改保存到数据库中,无需用户显式地执行COMMIT操作。

        然而,当 autocommit 设置为 OFF 时,用户需要手动控制事务的提交。在这种情况下,用户可以执行多个DML操作,并且这些更改在事务提交之前都不会被永久保存到数据库中。用户需要显式地执行COMMIT操作来提交事务,或者执行ROLLBACK操作来撤销事务中的更改。
        查询(SELECT)操作则不受 autocommit 设置的影响。无论 autocommit 是开启还是关闭,SELECT语句都会正常执行并返回结果,因为它不会改变数据库中的数据。

因此,autocommit 设置只影响那些会改变数据库中数据的DML操作,而不包括查询操作。 

1.2.autocommit的设置与查看

用户可以将自动提交功能强制置为OFF。这样用户执行SQL语句后将不会被提交了,而执行COMMIT命令才提交,执行ROLLBACK命令回滚。

  • 查看当前设置

用户可以使用以下SQL命令来查看autocommit的当前状况:

SHOW VARIABLES LIKE 'autocommit';

 

很明显,我们的自动提交已经开启了!

  • 永久设置

要永久更改autocommit的值,用户需要修改MySQL的配置文件(通常是my.cnf或my.ini)。

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

 在配置文件的[mysqld]部分,用户可以添加或修改以下行来设置autocommit的值: 

autocommit=0
或者
autocommit=1

完成配置文件的修改后,用户需要重启MySQL服务来使更改生效。

sudo service mysql restart

这样子就算是配置好了!!! 

  • 临时设置

用户可以使用以下SQL命令来临时更改autocommit的值。这些更改仅在当前数据库会话中有效,当会话结束时,autocommit的值将恢复到默认值或配置文件中的设置值。

SET AUTOCOMMIT=1; -- 设置为自动提交模式  
SET AUTOCOMMIT=0; -- 设置为手动提交模式 

我们可以使用这个来展示一下MySQL的手动提交事务

1.3.使用示例

我们先创建一个表来

create table test(id int,name varchar(10));
insert into test values(1,'A'),(2,'B');
select * from test;

 

接下来我们先测试autocommit会不会影响我们的查询操作 

SET AUTOCOMMIT=1;
select * from test;
SET AUTOCOMMIT=0;
select * from test;

 

我们发现autocommit并不会影响到 这个查询操作,接下来我们来测试一下我们的插入操作。

​SET AUTOCOMMIT=1;
insert into test values(3,'C');
select * from test;SET AUTOCOMMIT=0;
insert into stu test(4,'D');
select * from test;

嗯?为什么两个情况是一样的??都能查询的到?

但是,要是我们现在打开另外一个终端登陆我们的mysql数据库查询我们的test,就会发现下面这个情况

 

我们发现4,B不在里面!!!

这是什么情况!!

这里的关键在于理解MySQL中事务的提交和回滚机制,以及 AUTOCOMMIT 设置的实际影响。

AUTOCOMMIT=0 的影响:

  • 当您设置 AUTOCOMMIT=0 时,MySQL会开始一个新的事务,并且不会自动提交该事务中的任何更改。这意味着,从那时起,您执行的任何DML操作(如INSERT、UPDATE、DELETE)都会成为事务的一部分,直到您显式地执行 COMMIT 或 ROLLBACK。

事务的持久性:

  • 在MySQL中,当您执行 COMMIT 时,事务中的所有更改都会成为数据库中的永久更改,并且对其他会话可见。
  • 如果您执行 ROLLBACK,则事务中的所有更改都会被撤销,就像它们从未发生过一样。

未提交事务的可见性:

  • 通常,未提交的事务对其他会话是不可见的。但是,在同一个会话中,即使您没有提交事务,您仍然可以看到自己在这个事务中所做的更改。这是因为MySQL允许会话在事务期间查看自己的更改(这通常被称为“一致性读”或“非阻塞读”)。

缺少 COMMIT 或 ROLLBACK:

  • 在会话中,我们没有执行 COMMIT 或 ROLLBACK 来结束事务。但是,由于您是在同一个会话中查询数据,因此您仍然能够看到新插入的行。如果您在另一个会话中查询 test 表,并且那个会话在您的插入操作之前没有开始,那么在那个会话中您将看不到未提交的行。

会话结束时的自动回滚:

  • 重要的是要注意,如果您在禁用 AUTOCOMMIT 的情况下结束了一个MySQL会话(比如通过关闭客户端连接),那么MySQL会自动回滚该会话中所有未提交的事务。这意味着,如果您没有显式地提交事务,那么当会话结束时,您所做的更改将不会被保存到数据库中。

综上所述,尽管您在 AUTOCOMMIT=0 的情况下插入了数据,并且能够在同一个会话中看到这些数据,但这并不意味着这些数据已经被永久保存到数据库中。

  1. 如果您想要确保数据被永久保存,您需要在插入数据后执行 COMMIT。
  2. 如果您想要撤销更改,您可以执行 ROLLBACK。
  3. 如果您不执行任何操作并结束会话,那么更改将被自动回滚。

好,看到这里我们算是明白了!接下来我们执行ROLLBACK;

        在MySQL中,ROLLBACK; 命令用于撤销(或回滚)当前事务中所做的所有更改。当您在一个事务中执行了多个DML操作(如INSERT、UPDATE、DELETE)后,如果您决定不想保存这些更改,您可以使用ROLLBACK;命令来撤销它们。

这里有一些关键点需要了解:

事务的开始

  1. 当您执行一个DML操作时并且AUTOCOMMIT设置为0(或您已经通过START TRANSACTION;显式地开始了一个事务),MySQL会开始一个新的事务。

事务的提交

  1. 如果您想要保存事务中的更改,您需要使用COMMIT;命令。

事务的回滚:

  1. 如果您决定不保存事务中的更改,您可以使用ROLLBACK;命令来撤销它们。回滚后,事务中的所有更改都将被撤销,就像它们从未发生过一样。

AUTOCOMMIT的影响:

  1. 当AUTOCOMMIT设置为1时,MySQL会在每个DML操作后自动提交事务。这意味着,每个DML操作都会立即成为数据库中的永久更改,并且不能被回滚。
  2. 当AUTOCOMMIT设置为0时,您需要显式地使用COMMIT;或ROLLBACK;来结束事务。

使用ROLLBACK;的时机:

  1. 您可以在事务中的任何时间点使用ROLLBACK;来撤销从上一个COMMIT;(或事务开始)以来的所有更改。
  2. 如果您在一个事务中执行了多个操作,并且决定不想保存任何更改,那么您应该在执行任何其他操作之前立即使用ROLLBACK;。

注意事项:

  1. 一旦您执行了COMMIT;,事务中的所有更改都将被永久保存到数据库中,并且不能再使用ROLLBACK;来撤销它们。
  2. 如果您结束了MySQL会话(例如,通过关闭客户端连接),并且在该会话中有未提交的事务,那么MySQL会自动回滚这些事务中的更改。

  • 未使用commit时使用rollback 
ROLLBACK;

 

执行我们发现我们插入的就不见了!!!

另外一台机器也没有看到我们的数据(4,D)

  • 未使用rollback时使用commit

我们现在换一台机器看

很显然,我们插入的数据还没有保存!!!

我们回到开始那台机器执行commit

接着,我们换一台机器看

很好,我们的数据保存了!!!这个时候我们再按rollback也无力回天了!!

其他机器也是如此


到现在我们就很清楚了我们的autocommit的工作场景

  1. autocommit=0
  2. 事务开始:执行了删除,修改,增加操作后
  3. 事务结束:执行了commit,rollback两个的任意一条

这3者缺一不可!!!!!

2.事务操作API

对于事务的操作我们也可以使用mysql_query()函数进行开启一个事务,然后进行处理事务,下面我们介绍一些关于控制事务操作的一些API。

2.1.设置事务提交模式——mysql_autocommit()

mysql_autocommit() 是 MySQL C API 中用于设置或检查当前会话的自动提交模式的函数。

  1. 在自动提交模式下,每个独立的语句(如 INSERT、UPDATE 或 DELETE)在被执行后都会自动提交到数据库中,这意味着每个语句都会立即生效,并且不能被回滚。
  2. 相反,在非自动提交模式下,你需要显式地使用 COMMIT 语句来提交事务,或者使用 ROLLBACK 语句来撤销自上次提交以来所做的所有更改。

函数原型

my_bool mysql_autocommit(MYSQL *mysql, my_bool mode); 
  1. mysql:一个指向已连接的 MYSQL 对象的指针。
  2. mode:一个 my_bool 值,用于指定要设置的自动提交模式。1(或非零值)表示启用自动提交,0 表示禁用自动提交。

返回值

  • 如果函数成功,则返回之前的自动提交模式(1 表示启用,0 表示禁用)。
  • 如果函数失败,则返回 -1。

使用示例

MYSQL *conn;  
// 假设 conn 已经通过 mysql_real_connect() 成功连接到数据库  // 检查当前的自动提交模式  
my_bool current_mode = mysql_autocommit(conn, 0);  
if (current_mode == -1) {  // 处理错误  
} else {  printf("Current autocommit mode: %s\n", current_mode ? "enabled" : "disabled");  
}  // 设置自动提交模式为禁用  
if (mysql_autocommit(conn, 0) == -1) {  // 处理错误  
} else {  printf("Autocommit mode disabled.\n");  
}  // 执行一些事务性操作...  // 提交事务(仅在自动提交被禁用时需要)  
if (mysql_commit(conn) == -1) {  // 处理错误  
} else {  printf("Transaction committed.\n");  
}  // 恢复自动提交模式为启用  
if (mysql_autocommit(conn, 1) == -1) {  // 处理错误  
} else {  printf("Autocommit mode enabled.\n");  
}  // 关闭连接(不要忘记这一步)  
mysql_close(conn);

注意事项

  1. 在禁用自动提交模式后,务必确保在适当的时候使用 COMMIT 提交事务,或者使用 ROLLBACK 撤销事务。否则,你的更改将不会被保存到数据库中,并且在会话结束时可能会被自动回滚。
  2. 调用 mysql_autocommit() 时,如果当前有一个正在执行的事务(即已经执行了一些更改但尚未提交或回滚),则这些更改的状态将取决于你之后是调用 COMMIT 还是 ROLLBACK。在禁用自动提交模式后,直到你提交或回滚事务之前,其他会话将无法看到这些更改。

 2.2.提交事务——mysql_commit()

mysql_commit() 是 MySQL C API 中的一个函数,用于提交当前事务。

当在 MySQL 会话中禁用自动提交模式后(通过调用 mysql_autocommit(mysql, 0)),你可以执行多个 SQL 语句作为单个事务的一部分。这些语句要么全部成功并提交,要么在遇到错误时全部回滚。要提交这些语句作为事务的一部分,你需要调用 mysql_commit()。

函数原型

int mysql_commit(MYSQL *mysql); 
  • mysql:一个指向已连接的 MYSQL 对象的指针,该对象代表与 MySQL 服务器的连接。

返回值

  1. 如果函数成功,则返回 0。
  2. 如果函数失败,则返回非零值。通常,你可以通过调用 mysql_error(mysql) 来获取更详细的错误信息。

使用示例

MYSQL *conn;  
// 假设 conn 已经通过 mysql_real_connect() 成功连接到数据库,并且已经禁用了自动提交模式  // 执行一些事务性操作,例如 INSERT、UPDATE 或 DELETE 语句  
if (mysql_query(conn, "INSERT INTO my_table (column1) VALUES ('value1')") != 0) {  // 处理错误  fprintf(stderr, "INSERT failed: %s\n", mysql_error(conn));  // 可能需要回滚事务  mysql_rollback(conn);  // 然后关闭连接等清理操作  
}  
// ... 可能还有其他事务性操作 ...  // 提交事务  
if (mysql_commit(conn) != 0) {  // 处理错误  fprintf(stderr, "Commit failed: %s\n", mysql_error(conn));  // 在某些情况下,你可能希望回滚事务(尽管在提交失败后回滚可能没有意义)  // 或者进行其他错误处理  
} else {  printf("Transaction committed successfully.\n");  
}  // 启用自动提交模式(可选,取决于你的应用程序逻辑)  
mysql_autocommit(conn, 1);  // 关闭连接  
mysql_close(conn);

注意事项

  1. 在调用 mysql_commit() 之前,确保你已经禁用了自动提交模式,并且已经执行了作为事务一部分的所有 SQL 语句。
  2. 如果 mysql_commit() 失败,并且你希望保留部分或全部更改,则可能需要手动处理错误,并决定是回滚事务还是采取其他措施。然而,请注意,在 mysql_commit() 调用失败后回滚事务可能不是有效的操作,因为提交操作本身可能已经部分完成或失败,导致事务状态不确定。
  3. 在事务提交后,所有在事务中执行的更改都将对数据库中的其他会话可见。

2.3.事务回滚——mysql_rollback()

mysql_rollback() 是 MySQL C API 中的一个函数,用于回滚当前事务。

当在 MySQL 会话中禁用自动提交模式后,你可以执行一系列 SQL 语句作为单个事务的一部分。如果在这些语句执行过程中发生错误,或者出于某种原因你决定不保留这些更改,你可以调用 mysql_rollback() 来撤销自上次提交以来所做的所有更改。

函数原型

int mysql_rollback(MYSQL *mysql); 
  • mysql:一个指向已连接的 MYSQL 对象的指针,该对象代表与 MySQL 服务器的连接。

返回值

  1. 如果函数成功,则返回 0。
  2. 如果函数失败,则返回非零值。通常,你可以通过调用 mysql_error(mysql) 来获取更详细的错误信息。

使用示例

MYSQL *conn;  
// 假设 conn 已经通过 mysql_real_connect() 成功连接到数据库,并且已经禁用了自动提交模式  // 执行一些事务性操作,例如 INSERT、UPDATE 或 DELETE 语句  
if (mysql_query(conn, "INSERT INTO my_table (column1) VALUES ('value1')") != 0) {  // 处理错误  fprintf(stderr, "INSERT failed: %s\n", mysql_error(conn));  // 回滚事务  if (mysql_rollback(conn) != 0) {  // 处理回滚错误  fprintf(stderr, "Rollback failed: %s\n", mysql_error(conn));  // 进行其他错误处理或清理操作  } else {  printf("Transaction rolled back successfully.\n");  }  // 可能需要重新尝试事务,或者进行其他逻辑处理  // ...  // 完成后关闭连接  mysql_close(conn);  return -1; // 或其他适当的错误代码  
}  
// ... 可能还有其他事务性操作 ...  // 如果所有操作都成功,则提交事务  
if (mysql_commit(conn) != 0) {  // 处理提交错误  fprintf(stderr, "Commit failed: %s\n", mysql_error(conn));  // 尝试回滚(尽管在提交失败后回滚可能没有意义,因为提交可能已经部分完成)  // 但出于完整性考虑,这里还是包含回滚调用  mysql_rollback(conn);  // 进行其他错误处理或清理操作  // ...  // 完成后关闭连接  mysql_close(conn);  return -1; // 或其他适当的错误代码  
} else {  printf("Transaction committed successfully.\n");  
}  // 启用自动提交模式(可选,取决于你的应用程序逻辑)  
mysql_autocommit(conn, 1);  // 关闭连接  
mysql_close(conn);

注意事项

  1. 在调用 mysql_rollback() 之前,确保你已经禁用了自动提交模式,并且已经执行了作为事务一部分的 SQL 语句。
  2. 如果在事务执行过程中发生错误,并且你决定不保留更改,应立即调用 mysql_rollback() 来撤销这些更改。
  3. 请注意,在调用 mysql_commit() 之后调用 mysql_rollback() 通常是无效的,因为提交操作已经将事务的更改永久保存到数据库中。然而,出于完整性考虑,你可以在提交失败后尝试回滚(尽管这通常没有意义),但应该意识到这样做可能不会撤销任何更改。
  4. 在回滚事务后,所有在事务中执行的更改都将被撤销,并且这些更改将不会对数据库中的其他会话可见。
  5. 确保在不再需要数据库连接时调用 mysql_close() 来释放资源。如果事务在回滚或提交之前由于某种原因被中断(例如,由于网络问题或服务器崩溃),则连接可能会处于不确定状态。在这种情况下,最好关闭连接并重新建立新的连接。

3.错误处理的API

3.1.返回错误的描述——mysql_error()

mysql_error() 是 MySQL C API 中的一个函数,用于获取最近一次 MySQL 函数调用失败的错误描述。

当你调用 MySQL C API 中的函数(如 mysql_query(), mysql_commit(), mysql_rollback() 等)时,如果函数返回非零值(通常表示失败),你可以使用 mysql_error() 函数来获取更详细的错误信息。

函数原型

const char *mysql_error(MYSQL *mysql); 
  • mysql:一个指向已连接的 MYSQL 对象的指针,该对象代表与 MySQL 服务器的连接。

返回值

  • 返回一个指向描述最近一次错误的字符串的指针。如果最近一次 MySQL 函数调用成功,则返回的字符串可能是一个空字符串或表示没有错误的消息(这取决于 MySQL 的版本和配置)。

使用示例

MYSQL *conn;  
// 假设 conn 已经通过 mysql_real_connect() 连接到数据库  // 执行一个查询  
if (mysql_query(conn, "SOME INVALID SQL STATEMENT") != 0) {  // 获取并打印错误信息  fprintf(stderr, "Query failed: %s\n", mysql_error(conn));  // 进行其他错误处理,如回滚事务或关闭连接  // ...  
} else {  // 处理查询结果  // ...  
}  // 关闭连接  
mysql_close(conn);

注意事项

  1. 在调用 mysql_error() 之前,确保你有一个有效的 MYSQL 连接对象,并且该对象与最近一次失败的 MySQL 函数调用相关联。
  2. mysql_error() 返回的字符串是静态分配的,并且在下次调用任何 MySQL 函数时可能会被覆盖。因此,如果你需要保留错误信息,请将其复制到自己的缓冲区中。
  3. 当你完成数据库操作并关闭连接后,再调用 mysql_error() 可能不会返回有用的信息,因为连接已经被销毁。
  4. 在多线程环境中,每个线程应该有自己的 MYSQL 连接对象,并且应该确保在调用 mysql_error() 时使用的是与失败操作相关联的正确连接对象。
  5. 记住,mysql_error() 只提供最近一次 MySQL 函数调用的错误信息。如果你执行了多个操作并且它们中的任何一个失败了,你应该在每次失败后立即检查错误,因为后续的操作可能会覆盖之前的错误信息。

3.2.返回错误的编号——mysql_errno()

mysql_errno() 是 MySQL C API 中的一个函数,它用于获取与最近一次 MySQL 函数调用失败相关联的错误编号。

与 mysql_error() 函数不同,mysql_errno() 返回的是一个整数错误代码,而不是描述错误的字符串。这个错误编号可以用于错误处理逻辑中,以便根据特定的错误类型执行不同的操作。

函数原型

unsigned int mysql_errno(MYSQL *mysql); 
  1. mysql:一个指向已连接的 MYSQL 对象的指针,该对象代表与 MySQL 服务器的连接。
  • 返回值
  1. 返回一个无符号整数,表示最近一次 MySQL 函数调用失败的错误编号。如果最近一次调用成功,则返回的值可能依赖于 MySQL 的实现,但通常可以认为是 0(表示没有错误)。

使用示例

MYSQL *conn;  
// 假设 conn 已经通过 mysql_real_connect() 连接到数据库  // 执行一个查询  
if (mysql_query(conn, "SOME INVALID SQL STATEMENT") != 0) {  // 获取错误编号  unsigned int err_no = mysql_errno(conn);  // 获取并打印错误信息  fprintf(stderr, "Query failed with error number: %u, message: %s\n", err_no, mysql_error(conn));  // 根据错误编号执行特定的错误处理逻辑  if (err_no == ER_BAD_TABLE_ERROR) {  // 处理表不存在的错误  // ...  } else if (err_no == ER_ACCESS_DENIED_ERROR) {  // 处理访问被拒绝的错误  // ...  } else {  // 处理其他类型的错误  // ...  }  // 进行其他错误处理,如回滚事务或关闭连接  // ...  
} else {  // 处理查询结果  // ...  
}  // 关闭连接  
mysql_close(conn);

注意事项

  1. 与 mysql_error() 一样,mysql_errno() 也需要在调用之前确保你有一个有效的 MYSQL 连接对象,并且该对象与最近一次失败的 MySQL 函数调用相关联。
  2. 错误编号是 MySQL 服务器定义的,并且可以在 MySQL 的文档或错误日志中找到它们的含义。
  3. mysql_errno() 返回的错误编号是静态的,直到你执行另一个 MySQL 函数调用为止。因此,你应该在每次失败调用后立即检查错误编号。
  4. 在多线程环境中,每个线程应该有自己的 MYSQL 连接对象,并且应该确保在调用 mysql_errno() 时使用的是与失败操作相关联的正确连接对象。
  5. 记住,mysql_errno() 和 mysql_error() 提供了关于最近一次 MySQL 函数调用失败的不同类型的信息,通常你会同时使用这两个函数来获取完整的错误上下文。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录,还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录,还可以更新…

关于移动硬盘复制文件0x80071AC3错误解决方法

一、问题详情 新入手的西部数据移动硬盘在复制文件到手机是没有问题的,但是在电脑复制文件的时候,电脑弹出0x80071AC3错误,没办法复制文件,也没办法新建文件夹。 二、原因 因为卷有问题,请运行chkdsk并重试。 三、解…

使用Vue.js构建响应式Web应用

💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用Vue.js构建响应式Web应用 1 引言 2 Vue.js简介 3 安装Vue CLI 4 创建Vue项目 5 设计应用结构 6 创建组件 7 使用…

SLAM|1. 相机投影及相机畸变

一个能思考的人,才真是一个力量无边的人。——巴尔扎克 本章主要内容: 1.针孔相机模型 2.相机成像的几个坐标系图像 3.畸变及相机标定 本节主要介绍在照相机拍摄过程中,现实物体如何跟照片上的像素关联起来,具体涉及相机成像的物…

LabVIEW换流变换器智能巡检系统

基于LabVIEW的换流变换器智能巡检系统通过自动化检测和数据分析,提高换流变换器的运行效率和可靠性,降低人工维护成本。 项目背景: 换流变压器作为电力系统的重要组成部分,其性能的可靠性直接影响到整个电网的稳定运行。然而&…

Spring Boot:植物健康的智能守护者

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

Python基于amazon/chronos-t5-base的预训练模型离线对时间系列数据的未来进行预测

Python基于预训练模型对时间系列数据的未来进行预测 导入库 %matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd import torch from chronos import ChronosPipeline from tqdm.auto import tqdm from autogluon.timeseries import…

【Java】使用iText依赖生成PDF文件

文章目录 使用iText实现PDF文件生成1. 需求2 . 添加依赖3. 核心4. 实战案例:生成录用通知书4.1 整体架构4.2 初始化PDF文档4.3 配置中文字体4.4 添加背景图片4.5 添加文本内容4.6 处理文档生成 5. 关键技巧与注意事项5.1 字体处理5.2 图片处理5.3 布局控制5.4 异常处…

探索人工智能在自然语言处理中的应用

探索人工智能在自然语言处理中的应用 前言1. 机器翻译2. 情感分析3. 智能客服4. 文本生成未来展望 结语 前言 在信息爆炸的时代,自然语言处理(NLP)作为人工智能(AI)的一个重要分支,正以前所未有的速度改变着…

LabVIEW提高开发效率技巧----节省内存

在LabVIEW开发过程中,内存管理是保障程序稳定性和性能的关键。本文将详细介绍如何通过队列处理来节省内存,尤其是如何通过解耦释放不再需要的数据,防止内存泄漏。通过多个实际例子,从不同角度探讨队列处理在大数据量或长时间运行的…

苹果瑕疵数据集苹果质量数据集YOLO格式VOC格式 深度学习 目标检测 数据集

一、数据集概述 数据集名称:2类苹果图像数据集 数据集包含两类样本:正常苹果和有瑕疵的苹果。正常苹果样本代表完好的苹果,而有瑕疵的苹果样本代表苹果表面可能存在的损伤、瑕疵或病害。每个样本都经过详细标记和描述,以便训练模…

大语言模型数据类型与环境配置

文章目录 前言一、环境安装二、大语言模型数据类型1、基本文本指令数据类型2、数学指令数据类型3、几何图形指令数据类型4、多模态指令数据类型5、翻译指令数据类型 三、vscode配置 前言 简单给出环境安装与数据类型及vscode运行配置,其中vscode运行配置是便于我们…

专业135+总分400+西安交通大学815869(原909)信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

经过将近一年的考研复习,终于梦圆西安交大,今年专业课815(和专硕869(原909)差不多)信号与系统135,总分400,回想这一年的复习还有很多经验和大家分享,希望可以对大家复习有所帮助,少走…

3.cpp基本数据类型

cpp基本数据类型 1.cpp基本数据类型 1.cpp基本数据类型 C基本数据类型和C语言的基本数据类型差不多 注意bool类型&#xff1a;存储真值 true 或假值 false&#xff0c;C语言编译器C99以上支持。 C语言的bool类型&#xff1a;要添加 #include <stdbool.h>头文件 #includ…

数据库相关知识点

1. 数据库分片与分区 分片&#xff08;Sharding&#xff09;&#xff1a;这是一种将数据水平分割的技术&#xff0c;每个分片包含数据的一个子集。分片通常用于提高数据库的扩展性和性能&#xff0c;特别是在处理大量数据时。通过将数据分布在多个分片上&#xff0c;可以并行处…

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…

Maven基础知识

一、Maven的概述 maven 是什么&#xff1f; 是一个项目管理工具&#xff0c;它包含了一个项目对象模型&#xff0c;一组标准集合&#xff0c;一个项目的生命周期&#xff0c;一个依赖管理系统&#xff0c;和用来运行定义在生命周期阶段和插件目标的逻辑。 二、Maven的依赖管理…

【331】基于Springboot的“有光”摄影分享网站系统

“有光”摄影分享网站设计与实现 摘 要 自互联网的发展至今&#xff0c;其基础理论与技术都已完善&#xff0c;并积极参与了整个社会各个领域。它容许信息根据媒体传播&#xff0c;并和信息可视化工具一起为大家提供优质的服务。对于信息多头管理、差错率高、信息安全系数差、…

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…

本地docker部署中间件和应用

Docker Desktop搭建 安装完成之后使用docker下载镜像&#xff0c;报以下错误&#xff1a; 解决办法&#xff1a; Docker Engine配置能访问的镜像地址&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled…