MySQL事务

MySQL 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息;
  如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务是一个或者多个SQL语句组成的整体 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 事务用来管理 insert,update,delete 语句
事务的四大特性(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
    事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
    这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
    事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
原子性、一致性和持久性由事务的redo 日志和undo 日志来保证


在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。
因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET @@AUTOCOMMIT
=0,用来禁止使用当前会话的自动提交。 事务控制语句: BEGIN 或 START TRANSACTION 显式地开启一个事务; COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的; ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改; SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT; RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常; ROLLBACK TO identifier 把事务回滚到标记点; SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。 MYSQL 事务处理主要有两种方法: 1、用 BEGIN, ROLLBACK, COMMIT来实现   BEGIN 开始一个事务   ROLLBACK 事务回滚   COMMIT 事务确认 2、直接用 SET 来改变 MySQL 的自动提交模式:   SET @@AUTOCOMMIT=0 禁止自动提交 手动提交   SET @@AUTOCOMMIT=1 开启自动提交
3、查询提交模式:select @@AUTOCOMMIT;

事务的四个隔离级别
序号    隔离级别        功能                                 会引发问题
1   read uncommitted 代表可以读取其他事务未提交的数据                     脏读、不可重复读、幻读
2   read committed 代表只能读取其他事务提交的数据                      不可重复读、幻读
3   repeatable read 代表事务在执行中反复读取数据,得到的结果 是一致的,不会受其他事务影响 幻读
4   serializable 序列化 让事务逐一执行                          无

脏读:在一个事务处理的过程中读取到了另一个未提交事务中的数据,导致两次查询结果不一致
不可重复读:在一个事务处理的过程中读取到了另一个事务中修改并已提交的数据,导致两次查询结果不一致
幻读:查询某数据不存在,准备插入此记录,但执行插入时发现此记录已存在,无法插入。或查询数据不存在执行删除,却删除成功

查询数据库的隔离级别:select @@tx_isolation
修改数据库的隔离级别:set global transaction isolation level 级别字符串;

存储引擎
常见引擎:InnoDB、MyISAM、MEMORY
MySQL5.5版本后默认InnoDB
InnoDB:
  特点:MySQL的默认存储引擎,支持事务和外键操作
  使用场景:对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,读写频繁的操作! 
查询数据库支持的存储引擎: show engines;
查询某个数据库中所有数据表的存储引擎: show table status from 数据库名称;
查询某个数据库中某个数据表的存储引擎: show table status fron 数据库名称 where name='数据表名称';
创建数据表,指定存储引擎: create table 表名(列名,数据类型...)engine = 引擎名称;
修改数据表的存储引擎 alter table 表名 engine = '引擎名称';
MySQL索引
数据表的索引:MySQL利用二叉树结构,对数据表的记录排序,从而加速
数据的检索速度(B+树)
创建索引:create [unique|fulltext] index 索引名称 [using 索引类型] on 表名 (列名);
  unique:唯一索引 fulltext:全文索引 不选则是普通索引
创建普通索引:create index 索引名 on 表名(列名);
创建唯一索引:create unique index 索引名 on 表名(列名);
查看索引:show index from 表名;
注意:主键列自带主键索引,外键列自带外键索引

索引操作:
1.添加索引:
  普通索引:alter table 表名 add index 索引名称(列名);
  组合索引:alter table 表名 add index 索引名称(列名1,列名2...);
  主键索引:alter table 表名 add primary key(主键列名);
  外键索引:alter table 表名 add constraint 外键名 foreign key (本表外键列名) references 主键名(主键列名);
  唯一索引:alter table 表名 add unique 索引名称(列名);
  全文索引:alter table 表名 add fulltext 索引名称(列名);
2.删除索引
  drop index 索引名称 on 表名;

 

posted @ 2021-04-22 21:31  景、  阅读(44)  评论(0编辑  收藏  举报