「学习笔记」MySQL事务处理与并发控制

1. MySQL事务

  1. 事务: 数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;事务是一组不可再分割的操作集合(工作逻辑单元);
  2. 事务的特性(ACID):
    • 原子性(Atomicity,或称不可分割性):最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚
    • 一致性(Consistency):事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则, 不会因为出现系统意外等原因导致状态的不一致
    • 隔离性(Isolation,又称独立性):一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般设定为不可见)
    • 持久性(Durability):事务所做的修改就会永久保存,不会因为系统意外导致数据的丢失
  3. 事务的开启与提交模式
    • 若参数autocommit=0,自动开启手动提交
    • 若参数autocommit=1(系统默认值),又分为两种状态:
      • 自动开启自动提交:用户的每一个操作都是一个完整的事务周期。
      • 手动开启手动提交:从用户执行start transaction命令到用户执行commit命令之间的一系列操作为一个完整的事务周期。若不执行commit命令,系统则默认事务回滚。
        • begin 或者 start transaction – 开启事务
        • commit 或者 rollback – 事务提交或回滚
1.1 事务的隔离级别
  • 查看/设置隔离级别
    • 查看:SELECT @@tx_isolation
    • 设置:set tx_isolation='xxx'
  1. 读未提交(Read Uncommitted)
    • 事务未提交对其他事务也是可见的,脏读(dirty read)
  2. 读提交(Read Committed)–解决脏读问题
    • 一个事务开始之后,只能看到自己提交的事务所做的修改,不可重复读(nonrepeatable read)
  3. 可重复读(Repeatable Read)–解决不可重复读问题
    • 在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题
  4. 串行化(Serializable)–解决所有问题
    • 最高的隔离级别,通过强制事务的串行执行,但是会导致大量超时以及锁争用问题

Mysql默认采用REPEATABLE_READ隔离级别,Oracle默认采用READ_COMMITTED隔离级别。 事务的隔离级别的实现:锁、MVCC(多版本并发控制 Multiversion Currency Control)。

「学习笔记」MySQL性能优化基础

1. MySQL基础操作

1.1 MySQL备份与恢复
  1. 备份:在mysql的安装目录的bin目录下有mysqldump命令,可以完成对数据库的备份。
    • 语法:mysqldump -u 用户名 -p 数据库名> 磁盘SQL文件路径
    • 由于mysqldump命令不是sql命令,需要在dos窗口下使用
    • 仅仅只会备份数据库中的表和数据,恢复时需要先手动创建数据库。
  2. 恢复:先手动创建数据库:create database 数据库名
    • 然后dos窗口:mysql -u 用户名-p 导入库名< 磁盘SQL文件绝对路径
1.2 MySQL事务基础
  1. 特性(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
  2. 事务隔离级别:读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  3. MYSQL事务处理主要有两种方法:
    1. 用 BEGIN, ROLLBACK, COMMIT来实现:
      • BEGIN 开始一个事务
      • COMMIT 事务确认
      • ROLLBACK 事务回滚
    2. 直接用 SET 来改变 MySQL 的自动提交模式:
      • SET AUTOCOMMIT=0 禁止自动提交
      • SET AUTOCOMMIT=1 开启自动提交
  4. 事务并发操作出现几种问题: 丢失修改数据、读“脏”数据、数据不一致
1.3 查看设置MySQL编码
  1. 查看:mysql> show variables like 'character%'
  2. 设置: # vi /etc/my.cnf
[mysqld] 
charactersetserver=utf8
collationserver=utf8_general_ci
sql_mode='NO_ENGINE_SUBSTITUTION'
[mysql] 
defaultcharacterset = utf8 
[mysql.server] 
defaultcharacterset = utf8 
[mysqld_safe] 
defaultcharacterset = utf8 
[client] 
defaultcharacterset = utf8
  1. mysql的主配置文件: /etc/my.cnf
  2. 数据库文件存放位置: /var/lib/mysql
  3. 数据库的日志输出存放位置: /var/log/mysql
  4. 端口: Netstat –nltp 看是否能找到3306的端口
1.4 范式

概念:范式就是符合某一规范级别的关系模式的集合。共有7种范式:1NF⊃2NF⊃3NF⊃BCNF⊃4NF⊃5NF⊃6NF

「学习笔记」嵌入式SQL语言

概述

  • 交互式SQL语言有很多优点:记录集合操作、非过程性操作、一条语句就可实现复杂查询的结果,
  • 然而,交互式SQL本身也有很多局限:
    • 从使用者角度:专业人员可熟练写出SQL语句,但大部分的普通用户并非可以
    • 从SQL本身角度:特别复杂的检索结果难以用一条交互式SQL语句完成,此时需要结合高级语言中经常出现的顺序、分支和循环结构来帮助处理
  • 因此,高级语言+SQL语言:
    • 既继承高级语言的过程控制性
    • 又结合SQL语言的复杂结果集操作的非过程性
    • 同时又为数据库操作者提供安全可靠的操作方式:通过应用程序进行操作
  • 嵌入式SQL语言
    • 将SQL语言嵌入到某一种高级语言中使用
    • 这种高级语言,如C/C++, Java, PowerBuilder等,又称宿主语言(Host Language)
    • 嵌入在宿主语言中的SQL与前面介绍的交互式SQL有一些不同的操作方式

1. 变量声明与数据库连接

  1. 以宿主语言C语言为例,对比交互式SQL语言与嵌入式SQL语言
    • 交互式SQL:select Sname, Sage from Student where Sname='张三';
    • 嵌入式SQL:exec sql select Sname, Sage into :vSname, :vSage from Student where Sname='张三';
  2. 典型特点
    • exec sql引导SQL语句: 提供给C编译器,以便对SQL语句预编译成C编译器可识别的语句
    • 增加一 into子句: 该子句用于指出接收SQL语句检索结果的程序变量
    • 由冒号引导的程序变量,如: ‘:vSname’, ‘:vSage’
1.1 变量的声明与使用
  • 在嵌入式SQL语句中可以出现宿主语言语句所使用的变量,这些变量需要特殊的声明:
exec sql begin declare section;
    char vSname[10], specName[10]="张三";
    int vSage;
exec sql end declare section;
  • 变量声明和赋值中,要注意:
    • 宿主程序的字符串变量长度应比字符型字段的长度多1个。因宿主程序的字符串尾部多一个终止符为’\0’,而程序中用双引号来描述。
    • 宿主程序变量类型与数据库字段类型之间有些是有差异的, 有些DBMS可支持自动转换,有些不能。
  • 声明的变量,可以在宿主程序中赋值,然后传递给SQL语句的where等子句中,以使SQL语句能够按照指定的要求(可变化的)进行检索。
  • 嵌入式比交互式SQL语句灵活了一些:只需改一下变量值,SQL语句便可反复使用,以检索出不同结果。
  • 示例:
exec sql begin declare section;
    char vSname[10], specName[10]="张三";
    int vSage;
exec sql end declare section;
//用户可在此处基于键盘输入给specName赋值
exec sql select Sname, Sage into :vSname, :vSage from Student where Sname = :specName;
//比较相应的交互式SQL语句
select Sname, Sage from Student where Sname = '张三';
1.2 程序与数据库的连接和断开
1.2.1 数据库的连接connect

在嵌入式SQL程序执行之前,首先要与数据库进行连接, 不同DBMS,具体连接语句的语法略有差异

0%