MySQL事务初识

本文首发于我的微信公众号《andyqian》,期待你的关注 !

前言

  今天来讲说MySQL事务,其实MySQL事务是一个比较广且很是重要的概念。一篇文章确定是不够描述的,先后会分为好几篇文章来写这个专题,其中内容包括但不限于如下内容:数据库

  1. 事务的概念。微信

  2. 事务的原则。并发

  3. MySQL中事务自动提交,手动提交以及回滚。工具

  4. 事务各个隔离级别的区别。spa

  5. MySQL中如何设置事务?修改默认事务默认级别。3d

  6. 事务与锁的关系。排序

  7. 各种锁之间的区别以及使用场景。 等等!索引

内容按部就班,在前面的章节,讲解的都是比较大而全的概念,后面会掰开每一个细节来zhu说明。事务

什么是事务?

  提及事务,其实你们都挺熟悉的,维基百科中是这样描述的:ci

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

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

原子性(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隐式类型转换

扫码关注,一块儿进步

我的博客: http://www.andyqian.com

相关文章
相关标签/搜索