理解MySQL数据库事务

1. 什么是事务处理?mysql

事务处理是一种机制,它是用来管理必须成批执行的mysql操做。来保证数据库不完整的操做结果。sql

2. 为何要使用事务处理?数据库

在使用mysql操做数据的过程当中,若是只是简单的中小型程序而言,咱们不须要考虑mysql的事务。可是在比较复杂的状况下,用户执行某些数据操做过程当中,须要经过一组sql语句执行多项并行任务的时候。就必须保证操做数据的同步性。而且在执行中,产生依赖关系的动做可以同时操做成功或同时返回初始状态。那么在这种状况下,就须要考虑使用mysql事务处理了。并发

在mysql中,事务是由单独的一个或多个sql语句组成的。每一个sql语句都是互相依赖的。若是某条sql语句执行失败或发生异常的状况下,那么整个操做都会回滚。全部的数据操做都会返回原始的初始状态。若是单元中的全部的sql执行成功,那么事务就被顺利执行。网站

那么打个比方,好比银行转帐为列:spa

用户A须要给用户B转帐1000元,那么用户A使用手机直接把1000元打到用户B的银行卡中了,指令已经发出去了,可是因为用户A把用户B的银行卡号输入错了,那么这种状况下,用户B的银行卡是不会多出1000元了,可是用户A银行卡少了1000元,那这样的话确定是不合理的,所以咱们须要将用户A向用户B转帐这么一件事情当作一个事务来处理。若是用户B的真实姓名和银行卡号对不上的话,那么整个转帐事务就会失败,那么所以须要使用回滚操做,回滚到转帐前的初始状态。所以用户A也不会少1000元,用户B也不会增长1000元。那么这种状况下才是最合理的。命令行

事务处理中的一些术语的解释:code

事务(transaction) 指一组sql语句。
回退(rollback) 指撤销指定sql语句的过程。
提交(commit) 指将未存储的sql语句结果写入到数据库中。
保留点(savepoint) 指事务处理中设置的临时占位符,咱们能够对他们发布回退操做。对象

3. mysql存储引擎blog

mysql的存储引擎是能够改变的,默认是 InnoDB 存储引擎,mysql中有8种存储引擎。

1. MyISAM: 他是高速引擎,可是不支持事务处理。
2. InnoDB: 支持行锁定以及事务处理,速度比MyISAM稍慢
3. ISAM: MyISAM的前身
4. MERGE: 将多个MyISAM类型的表做为一个表来处理的引擎
5. MEMORY,HEAP: 只在内存上保存数据
6. Falcon: 一种新的存储引擎,支持事务处理
7. ARCHIVE: 将数据压缩后保存(只能支持INSERT/SELECT操做
8. CSV: 以CSV形式保存数据(应用于跨平台数据交换)

如上只是了解下有哪些存储引擎,其实咱们mysql的常见使用的存储引擎就是 InnoDB,其余的咱们能够简单的了解下就
能够了。

数据库事务相关命令以下:

1. 查看存储引擎:SHOW CREATE TABLE 表名;
2. 更改引擎: ALTER TABLE 表名 ENGINE=新引擎名;
3. 回滚: ROLLBACK;
4. 声明事务开始: BEIGIN;
5. 事务提交: COMMIT;
6. 查询自动提交功能状态: SELECT @@AUTOCOMMIT;
7. 设置自动提交功能: SET AUTOCOMMIT=0或1;
8. 设置分离水平: SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

1. 查看存储引擎,使用命令:SHOW CREATE TABLE 表名; 以下图所示:

2. 更改存储引擎,使用命令:ALTER TABLE 表名 ENGINE=新引擎名; 以下图所示:

4. 事务处理

事务有以下四大特性:

1. 原子性:指事务包含的全部操做要么所有成功,要么所有失败回滚。

2. 一致性:指事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(好比拿转帐来说,假设用户A和用户B二者的钱加起来一共是2000,那么不论是用户A仍是用户B之间如何转帐,转几回帐,事务结束后两个用户的钱加起来应该仍是2000,因此这就是事务的一致性)。

3. 隔离性:指当多个用户并发访问数据库而且操做同一张表的时候,数据库为每个用户开启的事务,不能被其余事务的操做所干扰,多个并发事务之间要相互隔离。

4. 持久性:指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,哪怕是在数据库系统遇到故障的状况下也不会丢失提交事务的操做。

如上就是事务四大特性。咱们能够简单的理解下就能够了。

4.1 回滚演示(ROLLBACK)

以下图所示:

 

如上演示咱们能够看到,当咱们删除表格里面的数据的时候,咱们再执行回滚操做(ROLLBACK), 删除的记录又恢复到begin以前的状态,若是咱们将 ROLLBACK 换成 COMMIT 的话,那么事务将会被提交了,删除的事务就不能再恢复了。
以下继续演示下:

4.2 自动提交

当咱们的mysql的数据库的引擎为 InnoDB的时候,咱们能够设置自动提交功能是否开启,当自动提交功能为on的时候,命令执行就会提交(commit). 当咱们自动提交设置为off的时候,必须执行commit才会提交事务。可是咱们可使用rollback进行回滚操做。

首先咱们来查询下当前自动提交功能的状态;以下基本语法:

select @@autocommit;

以下所示:

咱们须要设置自动提交功能的基本语法以下:

set autocommit = 0 或 1;

注意:0 表明是off,1表明的是on.

4.2.1 自动提交设置为off

若是咱们将自动提交设置为off的时候,咱们插入一条记录,而后咱们使用回滚 rollback的操做,咱们再次查看记录,会发现咱们返回到了初始状态。以下图所示:

可是当咱们将自动提交设置为on的时候,咱们插入一条数据后,而后咱们使用回滚 rollback的时候,咱们再次查看记录,会发如今咱们插入数据的时候,会自动触发commit状态(自动提交). 所以回滚的时候是回滚不了初始咋提的。
以下图所示:

4.3 部分回滚 savepoint

若是咱们设置 autocommit = 0 的时候,不自动提交,而后咱们使用 rollback会回滚到咱们的初始状态的时候,而咱们如今经过 savepoint 就能够保存一个点,经过 rollback to savepoint 就能够回滚到保存的点了。

部分回滚主要有两个步骤:

1. 保存点:执行命令:savepoint 保存点名;

2. 回滚到保存点:执行命令:rollback to savepoint 保存点名;

好比以下所示:

4.4 锁定与事务处理

如上咱们使用rollback操做是指一个用户下进行的。可是若是是多个用户下同时操做呢?好比说12306购票系统,无数的人同时使用,所以咱们的事务必须可以处理多个用户同时操做的状况。所以咱们须要锁定。

好比说:咱们过年的时候会在12306网站上同一刻时间点买票,好比说用户A和用户B同时登录购票网站,而且买的是同一张票,好比说看到的都是剩余1张票了,所以用户A和用户B赶忙下单,那么这个下单的时间点确定是有前后顺序对吧,那么假如用户A下单的时间更早,所以该票会被锁定,所以用户B就不能买了。这种状况就是事务的锁定。

4.4.1 锁定分为 共享锁定 和 排他锁定。

什么是共享锁定呢?共享锁定是将对象数据变为只读形式,不能进行修改的。
什么是排他锁定呢?排他锁定就是当咱们执行 insert/update/delete的时候,其余的事务不能读取该数据。所以咱们也能够叫作写入锁定。

4.4.2 事务处理的分离水平

事务处理的分离水平通常是 READ UNCOMMITED; 它能够是非提交读取,也能够不可重复读取,还能够是幻像读取。

设置分离水平可使用以下命令:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

1. 理解非提交读取

什么是非提交读取呢?指的是别的事务可以读取到尚未提交的更新数据。什么意思呢?好比说我使用sql语句更新了一些数据,可是并无使用commit提交,可是其余的用户能够查询到我刚刚更新的数据。为了演示下,咱们能够打开2个命令行窗口,演示以下:

2. 理解不可重复读取

不可重复读取是指在某事务处理过程当中对数据进行读取,因为该事务更新操做致使屡次读取数据时发生了改变。这个demo先省略了。。。

3. 理解幻象读取

幻象读取指的是,在某事物处理数据过程当中对数据屡次读取,因为该事务的插入/删除操做而致使在屡次读取过程当中读取到不存在或者消失的数据。这个demo先省略了。。。

相关文章
相关标签/搜索