MySQL高效编程学习笔记(六)--事务处理及锁定

一、存储引擎
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. 部分回滚-只提交针对数据库的部分操作

    操作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日志

猜你喜欢

转载自blog.csdn.net/HuYingJie_1995/article/details/88682787