MySQL之初识事务

说明

  最近来了不少新朋友,在这里表示感谢!有你们的真好!近期在写MySQL一系列文章(其中会掺杂一些其他文章以及个人随笔。但主要路线还是MySQL系列),由于MySQL系列文章会比较多,可能会写好一阵子。在文章中,我会尽量通过常见场景,案例来举例说明,而不是单纯的概念记录。写完MySQL系列后,再考虑后续其他系列的编写,但均会以系列文章来写。恩,在这期间,有任何问题以及想了解的事情,都可以在留言区留言。我一定会知无不言,言无不尽!

前言

  今天来说说MySQL事务,其实MySQL事务是一个比较广且非常重要的概念。一篇文章肯定是不够描述的,前后会分为好几篇文章来写这个专题,其中内容包括但限于以下内容:

  1. 事务的概念。
  2. 事务的原则。
  3. MySQL中事务自动提交,手动提交以及回滚。
  4. 事务各个隔离级别的区别。
  5. MySQL中如何设置事务?修改默认事务默认级别。
  6. 事务与锁的关系。
  7. 各类锁之间的区别以及使用场景。 等等!

内容循序渐进,在前面的章节,讲解的都是比较大而全的概念,后面会掰开每个细节来zhu说明。

什么是事务?

  说起事务,其实大家都挺熟悉的,维基百科中是这样描述的:

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务通常包含一个序列的对数据库的读/写操作。

既然说道了事务,就不得不说事务的四大特性了:

原子性(Atomicity):事务作为一个整体,也就是说事务中的对数据库的操作要么全部被执行,要么都不执行。例如: 我用银行转账,从A账户转账到B账户, 这里就存在A账户的扣减,B账户的添加。事务的原子性肯定是A账户扣减后,一定在B账户上添加。

一致性(Consistency): 事务应确保数据库的状态从一个一致状态转变为另一个一致状态。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。(这里还有很细节,在后续的文章中会详细说明。)

持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中,比如修改操作,事务提交后,就会永久修改。也就是说:开启事务后在没提交前,回滚是有效的。
例如:

begin;
  update t_base_user name=”鞠骞”,updated_at=now() where oid=1;
rollback;

这个时候才能回滚。
例如:

begin;
  update t_base_user name=”鞠骞”,updated_at=now() where oid=1;
commit;
rollback;

上面回滚是无效的。因为事务已提交,已经持久化了。此时回滚是无意义的。

MySQL设置自动提交

  其实在MySQL  InnoDB存储引擎中,默认是开启事务的。当然我们也可以通过命令来设置开启与禁用自动提交。

显示MySQL设置:

show variables like “autocommit”;

结果:

Variables_name value
autocommit ON

我们也可以通过下面命令来设置该属性的值。

set autocommit = 0;

来禁用自动提交。(注意不会立即生效)!

通过

set autocommit = 1;

命令来开启自动提交模式。

如何显示开启事务

  MySQL中也提供了一系列命令来控制手动的开启,提交,回滚事务操作。下面我们一一来介绍。

开启事务: 使用start transaction;或者begin;开启一个新的事务;

提交事务: commit,提交当前事务,使其持久化;

回滚事务: rollback,回滚当前事务。

下面举个例子:

begin;
  update t_base_user name=”鞠骞”,updated_at=now() where oid=1;
commit;

我们知道通过 begin;或 start transaction 命令只是开启了一个事务,如果没有commit;的话,其实对数据是没有真正的修改的,(我们可以使用Navicat工具,同时开启两个查询窗口来验证)。

今日命令

  今天给大家介绍的命令是:show index from table_name
作用: 显示该表中的所有索引信息。
例如:

show full index from t_base_user;

显示结果如下:
插入图片

Table:顾名思义,就是表名。
Non_unique: 0表示无重复项, 1表示允许重复。如主键,唯一索引则为0。
Key_name: 索引的名字,这里需要注意的是,除了自定义索引名字外,还有几个固定值: 如主键: PRIMARY。
Seq_in_index: 表示索引中的序号,值得注意的是,该字段从1开始。联合索引。如:

alter table t_base_user add index idx_email_name(email,name);

像上述这种,此时的email的Seq_in_index就是1,name的Seq_in_index就是2。

Column_name:索引列名。
Collation:表示如何在索引中对列进行排序。这可以具有值A(升序)或NULL(不排序)
Cardinality:根据以整数存储的统计数字进行计数。(参考值)。该基数越大,说明其命中索引的概率越大。
Sub_part:
索引前缀。也就是说,如果列只是部分索引,则索引字符的数量,如果整列索引,则为NULL。
Null :表示该索引是否允许NULL,如果允许则为YES,否则为’’。
Index_type:索引类型,常见有类型有(BTREE, FULLTEXT(全文), HASH(哈希), RTREE).

Comment :备注信息

Index_comment : 索引备注信息。创建时的信息,如:

alter table t_base_user add index idx_email_name(email,name) comment “remark”;

此时的”remark”内容,就会显示在此处。


相关阅读:

写会MySQL索引

读懂MySQL执行计划

谈谈MySQL隐式类型转换

学会MySQL LIMIT


这里写图片描述

扫码关注,一起进步

个人博客: http://www.andyqian.com