数据库的简介
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
数据库:电子化的文件柜。用户可以对文件中的数据进行新 增、截取、更新、删除等操作。
常用的数据库
MYSQL:玲珑的小老鼠
经常在老猫不经意间偷走了市场.
MS SQL Server:笼中小麻雀
受限于Windows平台的性能,难于在企业开发中大展身手.
IBM DB2:彪悍的大笨象
秉承了IBM一贯彪悍的性格,粗犷有余,细节不足.近年好一些
Oracle:飞天游龙
数据库市场上的潮流创造者;工业标准,事实上的制定者;程序员的黄金搭档。
SQL语言简述
SQL是结构化查询语言 (Structured Query Language) ,是数据库的灵魂!
SQL 是操作和检索关系型数据库的标准语言。
使用SQL语句,程序员和数据库管理员可以完成如下的任务:
-
改变数据库的结构//create drop alter
-
更改系统的安全设置//比如修改密码等,比如MySQL中每一个用户都存在用户
表中,我们可以对该表进行增删改查,或者对用户的可操作权限进项管理 -
增加用户对数据库或表的许可权限 //grant revoke
-
在数据库中检索需要的信息//select
-
对数据库的信息进行更新//update delete insert
具体的SQL
语句(statement):一条完整的SQL命令。
例如,SELECT * FROM QIANFENG;
是一条语句。
关键字(Keyword) :SQL语言保留的字符串。
例如,SELECT
和FROM
是关键字。
子句(clause):通常是由关键字加上其他语法元素构成。
例如:
SELECT *
是子句,(需要检索的信息)
FROM QIANFENG
也是子句。(来自哪个表)
结构化查询语言分类
数据查询语言(DQL:Data Query Language):语句主要包括select,用来在表中检索数据
数据操作语言(DML:Data Manipulation Language):语句主要包括insert,update和delete,用于添加,修改和删除表中的行数据。
事务处理语言(TPL:Transaction Process Language):语句主要包括commit和rollback,用于事务的提交和回滚。
数据控制语言(DCL:Data Control Language):语句主要包括grant和revoke,用于进行授权和回收权限
数据定义语言(DDL:Data Definition Language):语句主要包括create,drop,alter,用于定义、销毁和修改数据库对象。
事务的简介
事务也叫工作单元,是由一个或者多个SQL语句组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行失败,要么全部执行成功。在数据库中,通过事务来保证数据的一致性。
事务处理语言(Transaction Process Language):简称TPL,用来对组成事务的SQL语句的操作结果进行确认和取消。
提交事务:commit
事务回滚:rollback
通过事务的使用,能防止数据库中出现数据不一致的现象。
例如:两个银行账户转账,涉及到两条更新操作,这两条更新操作只允许全部成功或失败,否则数据会出现不一致的现象。
事务的特性
事务的特性可以用四个字母缩写表示:ACID
-
原子性(Atomicity)
事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功和部分失败的情况。 -
一致性(Consistency)
一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。 -
隔离性(Isolation)
一个事务的执行不会被另一个事务所干扰。比尔两个人同时从一个账户中取钱,通过事务的隔离性可以保证账户的余额的正确性。 -
持久性(Durability)
也称为永久性,指事务一旦被提交,对数据的改变就是永久的,不可以再被回滚。
事务结束
- 显示结束
提交:commit命令实现后,事务以成功的形式结束,组成事务的SQL语句全部生效。
回滚:rollback命令实现后,事务以失败的形式结束,组成事务的的SQL语句全部被取消。 - 隐式结束
- 隐式提交:执行一个DDL和DCL的语句的时候,从操作数据库工具中使用exit或者quit命令退出
- 隐式回滚:操作数据库工具强行退出;客户端服务器端异常中断;系统崩溃
设置保存点:在一个事务中,回滚到指定位置
savepoint
rollback to
回到指定位置,不会结束事务
例如:
事务的原子性
由于操作并不具有原子性,并且可以再分为多个操作,当这些操作出现错误或抛出异常时,整个操作就可能不会继续执行下去,而已经进行的操作造成的副作用就可能造成数据更新的丢失或者错误。
事务其实和一个操作没有什么太大的区别,它是一系列的数据库操作(可以理解为 SQL)的集合,如果事务不具备原子性,那么就没办法保证同一个事务中的所有操作都被执行或者未被执行了,整个数据库系统就既不可用也不可信。比如,文件剪切,你总不能剪切个文件,没复制过来就给人家删了吧 ,如果只给你一个操作就是剪切才可以用,编程也是这样,把你的一个操作合起来才能用。
回滚日志:
所有事务进行的修改都会先记录到回滚日志中,然后在对数据库中的对应行进行写入。在事务结束后再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚。
级联回滚:事务之间并行发生(相互依赖)
发生错误或者需要回滚的事务能够成功回滚(原子性)
说白了,就是做过的写下来,好比每个插入对应一个删除,错了之后,一看发现了就执行对应的删除操作。但是再底层一些就丧失了这种原子性,有兴趣的可以继续深究MySQL的存储机制。
事务的持久性
如果数据被写入到数据库中,那么数据一定能够被安全存储在磁盘上;而事务的持久性就体现在,一旦事务被提交,那么数据一定会被写入到数据库中并持久存储起来。
事务已经被提交之后,就无法再次回滚了
重做日志:
重做日志由两部分组成,一是内存中的重做日志缓冲区,因为重做日志缓冲区在内存中,所以它是易失的,另一个就是在磁盘上的重做日志文件,它是持久的。
当我们在一个事务中尝试对数据进行修改时,它会先将数据从磁盘读入内存,并更新内存中缓存的数据,然后生成一条重做日志并写入重做日志缓存,当事务真正提交时,MySQL 会将重做日志缓存中的内容刷新到重做日志文件,再将内存中的数据更新到磁盘上
除了所有对数据库的修改会产生重做日志,因为回滚日志也是需要持久存储的,它们也会创建对应的重做日志,在发生错误后,数据库重启时会从重做日志中找出未被更新到数据库磁盘中的日志重新执行以满足事务的持久性
事务的持久性需要通过一些框架里的某些类维持。
事务的隔离性
- 锁机制(可以防止脏读、幻读等产生数据垃圾的过程)
- 时间戳
对要读、写的数据加一个标记,如果写的话更改时间戳,读的时候看是否发生过更改
事务的一致性
这个就很好理解了,就是最后得到的数据的是在整个数据库系统中一致的。
执行完成只会剩下