一、存储引擎
1.mysql存储引擎
Msyql特征:可替换存储引擎构架,可以给不同表选择不同的引擎。
Msyql按功能可分为外层部分和内层部分,外层负责与客户端连接、事前调查sql语句的内容的功能;内层部分是所谓的引擎部分,负责接收外层的数据操作指示,完成实际的数据输入输出以及文件操作工作。
常用的存储引擎类型:
名称 | 特征 |
---|---|
MyISAM | 默认的高速引擎,不支持事务处理 |
InnoDB | 支持行锁定及事务处理,比myisam稍慢 |
MERGE | 将多个myisam类型的表做一个表处理的引擎 |
MEMORY,HEAP | 只在内存上保存数据默认的高速引擎,不支持事务处理 |
Falcon | 一种新的存储引擎,只是事务处理 |
ARCHIVE | 将数据压缩后保存(只能进行INSERT/SELECT操作) |
CSV | 以CSV形式保存数据(应用于跨平台数据交换) |
2.在sql语句末尾使用/G代替;,显示的结果可读性更好
Eg: show create table goods ; 和 show create table goods \G
3.修改存储引擎
ALTER TABLE goods ENGINE=MyISAM;
二、事务处理
1.事务处理例子:转账,一方扣除10元,一方增加10元,两件事作为一个事务处理,两件事都成功则提交(COMMIT),其中一个不成功则回滚(ROLLBACK)。
2.删除后回滚
(1)引擎修改为InnoDB
(2)BEGIN; (或 START TRANSACTION)
(3)delete等操作数据;
(4)ROLLBACK;
3.自动提交功能
SET AUTOCOMMIT=0; // 0手动提交(需要加COMMIT才提交) 1自动提交
-
部分回滚-只提交针对数据库的部分操作
操作1
SAVEPOINT point1;//定义保存点,point1为保存点名
操作2
ROLLBACK TO SAVEPOINT point1;//回到保存点point1时
5. 以下命令不在事务处理的利用范围
DROP DATABASE;
DROP TABLE;
DROP;
ALTER TABLE;
三、锁定和解锁
1.多个用户同时使用数据库时,可能发生数据冲突(多个用户对一个数据同时修改),这时需要使用锁定和解锁,锁定使数据库特定数据上锁不让其他用户操作。
2.锁定种类
(1)共享锁定(读取锁定):当用户A实施锁定后,用户B只能对数据进行参照而不能更新。
(2)排他锁定(写入或独占锁定):使用INSERT\UPDATE\DELETE命令对数据进行更新时使用的锁定,其他的进程或事物都不能读取该数据。
3.锁定粒度:即锁定对象的大小,分为记录(行)、表、数据库三种,mysql只支持行和表两种。
4.多用户数据更新中理解事务处理的分离水平
分离水平用于确定事务处理之间的影响水平,分离水平越高,数据整合性越高,但同时运行性越低,反之整合性越底,运行性越高。
分离水平 | 非提交读取 | 不可重复读取 | 幻象读取 |
---|---|---|---|
READ UNCOMMITTED非提交读取 | 是 | 是 | 是 |
READ COMMITTED不可重复读 | 否 | 是 | 是 |
REPEATABLE READ可重复读 | 否 | 否 | 是 |
SERIALIZABLE串行化 | 否 | 否 | 否 |
(1)非提交读取(脏读):可从别的事务读取到还未提交的更新数据
修改分离水平为READ UNCOMMITTED
Eg: SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SESSION为只适用于当前连接,GLOBAL为所有连接
(2)不可重复读取:在某一事务中对同一数据进行多次读取,但由于其他事物的更新动作读取的数据状态发生了改变。在READ COMMITTED状态下,比如在B访问A的第一次后A更新了数据,B访问第二次时的数据和第一次不同,要避免这种状态就要使分离水平高于READ COMMITTED。
(3)幻像读取:某事务处理对同一数据多次读取时,由于其他事务处理中进行了记录的插入删除操作(并且还未提交),产生了结果中出现了第一次读取时不存在的数据,或第一次有的数据消失了的现象。 当设置为SERIALIZABLE可避免消除该现象,只有当其他事务提交了修改项后该事物才会读取到变动后旳事务。
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
4. 与事务处理相关的两个日志UNDO日志和REDO日志