MySQL事务初识


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

  今天来说说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_namevalue
autocommitON

 

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值