事务处理及锁定

介绍

事务处理:将多个命令作为一个整体来执行,从而保证数据整合性的机制。与锁定机制和分离概念结合,可以看作保持数据依赖的同时,维护数据库性能的方法。


存储引擎

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 UNCOMMITTEDYYY
READ COMMITTEDNYY
REPEATEBLE READNNY
SERIALIZABLENNN

  并发操作带来数据不一致情况大致可以分为四类:1.丢失数据修改(另一本书上写的)2.读脏数据 3.不可重复读 4.产生幽灵(或称幻影)数据。

 

  深入理解失误处理内部动作

  与失误处理相关的日志可以分为两种类型,一个UNDO日志,另一个是REDO日志。

  UNDO日志

  又称为回滚段(Rollback Segment),在进行数据的插入、更新、删除的场合,保存变更之前的数据。在ROLLBACK时获得旧数据来覆盖新数据。ROLLBACK后或者COMMIT后,UNDO日志将被删除。

  REDO日志

  有时被称为事务处理日志或者日志。事务处理确定后,由于错误等原因是数据的更新没有正确反映到数据库中的时候,REDO日志提供了数据恢复用的手段。一般来说,对数据库进行了更新这些更新首先被保存在缓冲中,等到一定时间后集中处理,如果这时候出现错误的话,缓冲中的数据被丢失,这就需要REDO来进行复原。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值