介绍
事务处理:将多个命令作为一个整体来执行,从而保证数据整合性的机制。与锁定机制和分离概念结合,可以看作保持数据依赖的同时,维护数据库性能的方法。
存储引擎
MySQL功能可以分为两个部分,外层部分主要完成与客户端的连接以及事前调查SQL语句的内容的功能,内存部分就是所谓的存储引擎,它负责接收外层的数据操作指示,完成实际的数据输入输出以及文本操作工作
其工作模式图:
MySQL提供多种存储引擎,可以给不同表选择不同的存储引擎
默认Myisan不支持事务处理,需要事务处理就使用InnoDB
1、设置存储引擎
需要事务处理就使用InnoDB,有时候还没激活InnoDB,所以需要修改my.ini等文件来激活InnoDB引擎
通过语句
show create table 表名;
上面显示的信息有点乱,我们可以使用\G来代替 ;
2、修改存储引擎
通过语句
alter table 表名 ENGINE=新引擎;
事务处理
几个单独的处理看作一个整体来对待,这样理论的处理叫做事务处理
为什么要事务处理
想一下,比如一个用户转账整体,甲给乙的账户转账一万元,这里面涉及两个动作分别是“甲的账户扣除一万元”和“乙的账户增加一万元”,如果“甲的账户扣除一万元”这个动作发生异常,没有事务处理,那么只会甲的账户扣除一万元,乙的账户并没有增加一万元。
解决方法就是把两个动作作为一个事务来处理,一定要整个事务处理结束才结束,只要其中一件事发生错误,都会强制返回最初状态。这叫回滚,最后数据库的事务还有提交的这个动作
演示简单的事务处理
使用事务处理,涉及三个重要命令事务开始begin,事务提交commit和事务回滚rollback
步骤:
可以看出,表的数据是可以恢复原来的状态,但将rollback换成commit,那么删除的处理就被提交了,数据是无法恢复,所以一般在commit之前最好确认一下
自动提交功能
其实MySQL的所有命令都默认自动提交,特别是MyISAM的情况下,本身就不支持事务处理,只要执行了命令,所有命令都是会被提交
如果设置存储引擎是InnoDB,在执行begin命令,将不会自动提交,只有执行commit才会
设置语法
将自动提交功能设置OFF,也就不自动
set autocommit=0;
将自动提交功能设置ON,也就自动
set autocommit=1;
部分回滚—只提交对数据库的部分操作
这个通过设置保存点,然后回滚到保存点
看图容易理解
具体操作:
锁定和事务处理分离水平
这个类似Java的锁,当多个用户同时连接数据库,如果没有特殊处理,会很容易发生数据保存冲突,解决方法就是使用锁定(Lock),锁定是为了使数据库特定的数据不让其他用户操作的机制,而解除锁定成为解锁
锁定的种类
按照使用目录可以将锁定分为共享锁定和排他锁定
共享锁定是当用户参照数据时,将对象数据变为只读形式的锁定,也时候也叫读取锁定
排他锁定是使用insert/update/delete命令对数据进行更新时使用的锁定。其他的进程(事务)一律不能对读取该数据,实施了排他锁定的数据,在其他事务处理不能更新以及参照,因此也叫写入锁定或者独占锁定
锁定粒度
锁定对象大小,单位成为锁定粒度,比如3种锁定粒度:记录(行)、表、数据库。一般锁定的粒度越小同时运行性才约高,但是因为一个个锁定都还是消耗数据库服务器资源,意味锁定的数目越多,消耗数据库资源就越多。
多用户数据更新中理解事务处理的分离水平
如果锁定保持时间越长,同时运行性就下降,一般数据库中使用分离水平这个概念来确定事务之间的影响程度(同时运行时相互影响的机制),分离水平越高,数据的整合性就越高,同时运行性下降。增加死锁产生的概率。
分离水平 | 读脏数据 | 不可重复读 | 产生幽灵数据 |
READ UNCOMMITTED | Y | Y | Y |
READ COMMITTED | N | Y | Y |
REPEATEBLE READ | N | N | Y |
SERIALIZABLE | N | N | N |
并发操作带来数据不一致情况大致可以分为四类:1.丢失数据修改(另一本书上写的)2.读脏数据 3.不可重复读 4.产生幽灵(或称幻影)数据。
深入理解失误处理内部动作
与失误处理相关的日志可以分为两种类型,一个UNDO日志,另一个是REDO日志。
UNDO日志
又称为回滚段(Rollback Segment),在进行数据的插入、更新、删除的场合,保存变更之前的数据。在ROLLBACK时获得旧数据来覆盖新数据。ROLLBACK后或者COMMIT后,UNDO日志将被删除。
REDO日志
有时被称为事务处理日志或者日志。事务处理确定后,由于错误等原因是数据的更新没有正确反映到数据库中的时候,REDO日志提供了数据恢复用的手段。一般来说,对数据库进行了更新这些更新首先被保存在缓冲中,等到一定时间后集中处理,如果这时候出现错误的话,缓冲中的数据被丢失,这就需要REDO来进行复原。