C++MySQL数据库操作语句、事务的四大特性

事务一般用来管理 insert, update, delete语句。它是数据库并发控制的基本单位,是一个操作序列,要么都执行,要么都不执行。例如银行转账:账户A出账并是账户B入账,要么都成功,要么都失败。

一、事务的基本特性:原子性、一致性、隔离性、持久性。

原子性: 事务包含的所有操作要么全部成功,要么全部失败回滚。因为事务的操作如果成功必须全部应用到数据库,如果失败则不能对数据库有任何影响。

一致性:事务执行前和执行后都必须保持一致性,拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转账几次,事务结束之后两者的钱加起来还是5000,这就是事务的一致性。

隔离性:当多个用户并发访问数据库时,比如操作同一张表,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性 :一个事务一旦被提交了,那么多数据库的改变是永久性的,即使数据库系统出现故障也不会丢失已经提交的操作。

注意:在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作,也就是命令行下每输入一行指令执行后结果不可回滚,除非显式的用代码开启了事务机制

注意:在windows系统中SQL语句不区分大小写

(1)事务的开启

BEGIN;

START TRANSACTION;

(2)事务的提交

COMMIT;

(3)建立事务存档点

SAVEPOINT nameofsavepoint(自定义);

(4)删除事务存档点

RELEASE SAVEPOINT nameifsavepoint(无此存档点会报错);

(5)事务回滚

ROLLBACK;        //回滚到begin的位置。

ROLLBACK TO nameofsavepoint;          //回滚到指定存档点。

(6)设置事务的隔离级别

SET TRANSACTION;

C++操作Mysql的事务机制实例:

创建数据库名:lcs,表名:test

#include "stdafx.h"
#include <windows.h>//注意头文件顺序
#include "stdio.h"
#include "winsock.h"
#include "mysql.h"

MYSQL mysql, *sock;   //声明MySQL的句柄

int main(void)
{
	const char* host = "127.0.0.1";	//因为是作为本机测试,所以填写的是本地IP
	const char* user = "root";		//这里改为你的用户名,即连接MySQL的用户名
	const char* passwd = "123456";	//这里改为你的用户密码
	const char* db = "lcs";			//这里改为你要连接的数据库的名字
	unsigned int port = 3306;		//这是MySQL的服务器的端口,如果你没有修改过的话就是3306。
	const char* unix_socket = NULL;	//unix_socket这是unix下的,我在Windows下,所以就把它设置为NULL
	unsigned long client_flag = 0;	//这个参数一般为0
	
	MYSQL_RES* result;				//保存结果集 
	MYSQL_ROW row;					//代表的是结果集中的一行

	mysql_init(&mysql);				//连接之前必须使用这个函数来初始化
	if ((sock = mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag)) == NULL) //连接MySQL
	{
		fprintf(stderr, "连接失败,错误信息:%s\n", mysql_error(&mysql));
		exit(1);
	}
	else
	{
		fprintf(stderr, "连接MySQL成功!!\n");
	}

	const char* i_query_1 = "create database if not exists lcs";
	if (mysql_query(&mysql, i_query_1) != 0)		//不存在,则创建数据库
	{
		fprintf(stderr, "创建数据库lcs失败!\n");
		exit(1);
	}
	
	const char* i_query_2 = "select count(*) from information_schema.tables where table_schema = 'lcs' and table_name ='test'";
	if (0 != mysql_real_query(&mysql, i_query_2, (unsigned long)strlen(i_query_2)))
	{
		fprintf(stderr, "查询失败,错误信息:%s\n", mysql_error(&mysql));
		exit(1);
	}
	MYSQL_RES* pRes = mysql_store_result(&mysql);
	MYSQL_ROW row1 = mysql_fetch_row(pRes);
	if (atoi(row1[0]) != 1)
	{
		fprintf(stderr, "表不存在,错误信息:%s\n", mysql_error(&mysql));
	}
	mysql_free_result(pRes);

	//const char* i_query_3 = "drop table if exists test";
	//if (mysql_query(&mysql, i_query_3) != 0)		//删除表
	//{
	//	fprintf(stderr, "删除表失败!\n");
	//	exit(1);
	//}
	
	const char* i_query_4 = "create table if not exists test(id int,value varchar(10),text varchar(50))";
	if (mysql_query(&mysql, i_query_4) != 0)		//不存在,则建表
	{
		fprintf(stderr, "建表失败!\n");
		exit(1);
	}
	
	const char* i_query_5 = "insert into test(id,value,text)values(6,'6','this is 6')";
	if (mysql_query(&mysql, i_query_5) != 0)
	{
		fprintf(stderr, "插入失败!\n");
		exit(1);
	}

	const char* i_query_6 = "select * from test;";
	if (mysql_query(&mysql, i_query_6) != 0)       //查询
	{
		fprintf(stderr, "查询失败!\n");
		exit(1);
	}
	else
	{
		if ((result = mysql_store_result(&mysql)) == NULL) //保存查询的结果
		{
			fprintf(stderr, "保存结果集失败!\n");
			exit(1);
		}
		else
		{
			while ((row = mysql_fetch_row(result)) != NULL) //读取结果集中的数据,返回的是下一行。因为保存结果集时,当前的游标在第一行【之前】
			{
				printf("%s,%s,%s\n", row[0], row[1], row[2]);  //打印当前行的第一列的数据
			}
		}
	}
	mysql_free_result(result);  //释放结果集

	char a;
	if (mysql_query(&mysql, "begin ;") != 0)	//开启事务
	{
		fprintf(stderr, "事务失败!\n");
		exit(1);
	}
	else
	{
		const char* i_query_7 = "insert into test(id,value,text)values(5,'5','this is 5');";
		if (mysql_query(&mysql, i_query_7) != 0)
		{
			fprintf(stderr, "插入失败!\n");
			exit(1);
		}
		else
		{
			printf("输入指令0或1:\n");
			a = getchar();
			if (a == '0')  //如果输入为0,则回滚,为1则提交。
			{
				if (mysql_query(&mysql, "rollback;") != 0)	//事务回滚
				{
					fprintf(stderr, "回滚失败!\n");
					exit(1);
				}
				if (mysql_query(&mysql, "commit;") != 0)	//事务提交
				{
					fprintf(stderr, "提交失败!\n");
					exit(1);
				}
			}
			else
			{
				if (mysql_query(&mysql, "commit;") != 0)	//事务提交
				{
					fprintf(stderr, "提交失败!\n");
					exit(1);
				}
			}
		}
	}

	mysql_close(sock);//关闭连接
	system("pause");
	exit(EXIT_SUCCESS);
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于使用Dev-C++连接MySQL数据库的问题,你可以按照以下步骤进行操作: 1. 首先,确保已经安装了MySQL数据库,并且知道数据库的相关信息,如主机名、用户名、密码等。 2. 在Dev-C++中创建一个新项目,并添加MySQL的头文件和库文件。你可以从MySQL的官方网站下载并安装MySQL Connector/C++,然后将其添加到Dev-C++项目中。 3. 在代码中包含MySQL Connector/C++的头文件。例如: ```cpp #include <mysql_driver.h> #include <mysql_connection.h> ``` 4. 在代码中使用MySQL Connector/C++提供的方法连接到MySQL数据库。例如: ```cpp sql::mysql::MySQL_Driver *driver; sql::Connection *con; // 获取MySQL连接驱动 driver = sql::mysql::get_mysql_driver_instance(); // 连接到MySQL数据库 con = driver->connect("tcp://127.0.0.1:3306", "username", "password"); ``` 请将上面的"username"和"password"替换为你实际的数据库用户名和密码,"tcp://127.0.0.1:3306"替换为你的数据库主机和端口。 5. 成功连接到数据库后,你可以执行SQL查询和其他操作。例如: ```cpp sql::Statement *stmt; sql::ResultSet *res; stmt = con->createStatement(); res = stmt->executeQuery("SELECT * FROM your_table"); while (res->next()) { // 处理查询结果 std::cout << res->getString(1) << std::endl; } delete res; delete stmt; ``` 记得在程序结束时关闭数据库连接: ```cpp con->close(); delete con; ``` 这就是在Dev-C++使用MySQL数据库的基本步骤。希望对你有所帮助!如果你还有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值