1, C_API

使用C语言调用MySQL数据库涉及到使用MySQL的C API.

这是一组C语言函数,提供了从C语言程序连接和操作MySQL数据库的能力。(而这个库文件是MySQL官方提供).

1.1 安装这个库

我们可以通过如下命令安装这个库.

注意1:

  • 我们可以通过: locate mysql.h 找到这个库的头文件

  • 我们可以通过: locate libmysqlclient.so 找到这个库的动态库文件

注意2:

  • 在调用函数之前,需要包含头文件<mysql/mysql.h>

  • 在生成可执行程序的链接阶段时,需要加入链接选项 -lmysqlclient

1.2 使用流程

1.2.1 初始化连接

使用mysql_init()初始化连接:

ps: mysql_init函数线程不安全: 所以当在一个进程中的多个线程中准备同时创建多个数据库连接的时候, 建议先加锁(connect之后再解锁).

1.2.2 建立连接

使用mysql_real_connect()建立到MySQL服务器的连接:

1.2.3 执行SQL语句

使用mysql_query()执行SQL语句:

  • 这个函数可以用来执行增删改查的SQL指令。

1.2.4 处理结果

对于返回数据的查询,使用mysql_store_result()mysql_fetch_row()等函数来处理结果:

mysql_store_result:

mysql_free_result:

mysql_num_rows:

mysql_num_fields:

mysql_fetch_row:

1.2.5 关闭连接

使用mysql_close()关闭与MySQL的连接:

1.2.6 mysql_error函数

对于MySQL的C API库, 我们需要一种检测函数出错的机制, 而mysql_error这个函数可以帮助你诊断函数,了解为什么一个特定的MySQL操作(如连接、查询等)失败。

1.3 CODE

1.3.1 select

1.3.2 update

了解sql注入问题: 项目中讲

2, 事务Transaction

理解: 记住背会 (面试问的概率比较高)

数据基础

2.1 场景

假如我们在维护一个银行的用户表

2.2 事务

事务的概念:

组成逻辑的一组SQL操作,这个操作的各个单元/语句,要么都成功执行,要么都不成功执行.

构成事务的三个操作:

开启事务;

回滚;(非必要)

提交;

注意: 开启事务之后, 要注意提交(要么rollback, 要么commit).

2.3 事务特性ACID

做了一堆sql操作: 这些sql操作我们希望他是不可拆分的

原子性atomicity

一致性consistency

隔离性isolation

持久性durability

2.4 隔离级别

隔离级别就是为了研究这么一种情况: 存在两个数据库连接, 一个连接的事务在修改(添加/删除/修改), 另一连接中的事务在查找

2.1.0 数据的操作可能遇到的问题

场景一: 脏读(Dirty read)现象

一个事务读取到了另外一个事务还没提交的数据:即脏读(读到了脏数据)

场景二: 不可重复读(nonrepeatable read)

在同一个事务内,针对同一个数据,前后读取的数据不一样: 即不可重复读

场景三: 虚幻读/幻读/幻影读(phantom read)

在一个事务内,任何一条数据的内容前后读取一致, 但是数据条数前后不一定一致。

查看和修改隔离级别:

查看隔离级别

修改隔离级别

2.1.1 读未提交

读未提交(READ UNCOMMITTED): 在READ UNCOMMITTED级别,

事务中的修改, 即使没有提交, 对其他事务也都是可见的.(在一个事物中, 读取到另外一个事物的未提交的数据)

会产生: 脏读, 不可重复读, 幻读

修改隔离级别

操作

2.1.2 读已提交

读已提交(READ COMMITTED): 在READ COMMITTED级别,

一个事务开始之后, 只能看到自己的修改别的已经提交的事务的修改.

(即: 一个事务在提交之前, 所作的修改对其它事务是不可见的)

只能在当前事物中读到别的连接已经提交的事务( 别的连接没有提交的事务, 就读不到), 所以不会引发脏读问题, 但是引发了不可重复读, 幻读问题.

修改隔离级别

操作

2.1.3 可重复读

可重复读(REPEATABLE READ): 在REPEATABLE READ级别, 一个事务开始之后, 保证多次读取某同样的记录结果保持一致.

MySQL的默认隔离级别就是可重复读.

(但是要注意的是, 可重复读存在幻读问题; 而MySQL的InnoDB存储引擎解决了部分幻读问题/可并没有完全解决幻读问题)

不会再有脏读问题, 不会再有不可重复读问题, 演示结果上看没有幻读问题 (实际上在MySQl的可重复读隔离级别上是存在幻读的问题)

修改隔离级别

操作

2.1.4 串行化/序列化

串行化(SERIALIZABLE): 在SERIALIZABLE级别,它强制事务串行执行,SERIALIZABLE级别会在读取的每一行数据上都加上锁, 以保证事务的先后顺序,那么就不存在多个事务同时执行情况(也就没有上面的安全性问题).

修改隔离级别

操作

对比:

事务隔离级别对比

隔离级别脏读不可重复读虚幻读
读未提交(read uncommitted)
读已提交(read committed)X
可重复读(repeatable read)XX√-×
串行化(serializable)XXX