赞
踩
目录
什么是事务
事务的ACID原则
原子性(Atomic)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consist)
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务
一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多
个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。
隔离性(Isolated)
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系
统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性(Durable)
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
基本语法:
- -- 使用set语句来改变自动提交模式
- SET autocommit = 0; /*关闭*/
- SET autocommit = 1; /*开启*/
- -- 注意:
- --- 1.MySQL中默认是自动提交
- --- 2.使用事务时应先关闭自动提交
- -- 开始一个事务,标记事务的起始点
- START TRANSACTION
- -- 提交一个事务给数据库
- COMMIT
- -- 将事务回滚,数据回到本次事务的初始状态
- ROLLBACK
- -- 还原MySQL数据库的自动提交
- SET autocommit =1;
- -- 保存点
- SAVEPOINT 保存点名称 -- 设置一个事务保存点
- ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
- RELEASE SAVEPOINT 保存点名称 -- 删除保存点

事务处理步骤:
- /*
- A在线买一款价格为500元商品,网上银行转账.
- A的银行卡余额为2000,然后给商家B支付500.
- 商家B一开始的银行卡余额为10000
- 创建数据库shop和创建表account并插入2条数据
- */
- CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
- USE `shop`;
- CREATE TABLE `account` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `name` VARCHAR(32) NOT NULL,
- `cash` DECIMAL(9,2) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=INNODB DEFAULT CHARSET=utf8
- INSERT INTO account (`name`,`cash`)
- VALUES('A',2000.00),('B',10000.00)
- -- 转账实现
- SET autocommit = 0; -- 关闭自动提交
- START TRANSACTION; -- 开始一个事务,标记事务的起始点
- UPDATE account SET cash=cash-500 WHERE `name`='A';
- UPDATE account SET cash=cash+500 WHERE `name`='B';
- COMMIT; -- 提交事务
- # rollback;
- SET autocommit = 1; -- 恢复自动提交

索引的作用:
分类
主键 : 某一个属性组能唯一标识一条记录
特点 :
作用 : 避免同一个表中某数据列中的值重复
与主键索引的区别
- CREATE TABLE `Grade`(
- `GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,
- `GradeName` VARCHAR(32) NOT NULL UNIQUE
- -- 或 UNIQUE KEY `GradeID` (`GradeID`)
- )
作用 : 快速定位特定数据
注意 :
- CREATE TABLE `result`(
- -- 省略一些代码
- INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 创建表时添加
- )
- -------------------------------
-
-
- -- 创建后添加
- ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);
作用 : 快速定位特定数据
注意 :
- /*
- #方法一:创建表时
- CREATE TABLE 表名 (
- 字段名1 数据类型 [完整性约束条件…],
- 字段名2 数据类型 [完整性约束条件…],
- [UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
- [索引名] (字段名[(长度)] [ASC |DESC])
- );
- #方法二:CREATE在已存在的表上创建索引
- CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
- ON 表名 (字段名[(长度)] [ASC |DESC]) ;
- #方法三:ALTER TABLE在已存在的表上创建索引
- ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
- 索引名 (字段名[(长度)] [ASC |DESC]) ;
- #删除索引:DROP INDEX 索引名 ON 表名字;
- #删除主键索引: ALTER TABLE 表名 DROP PRIMARY KEY;
- #显示索引信息: SHOW INDEX FROM student;
- */
- /*增加全文索引*/
- ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname`
- (`StudentName`);
- /*EXPLAIN : 分析SQL语句执行性能*/
- EXPLAIN SELECT * FROM student WHERE studentno='1000';
- /*使用全文索引*/
- -- 全文搜索通过 MATCH() 函数完成。
- -- 搜索字符串做为 against() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个
- 记录行,MATCH() 返回一个相关性值。即,在搜索字符串与记录行在 MATCH() 列表中指定的列的文
- 本之间的相似性尺度。
- EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');

EXPLAIN:https://blog.csdn.net/jiadajing267/article/details/81269067
- -- 我们可以在创建上述索引的时候,为其指定索引类型,分两类
- hash类型的索引:查询单条快,范围查询慢
- btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
- -- 不同的存储引擎支持的索引类型也不一样
- InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
- MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
- Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
- NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
- Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;
关于索引的本质:http://blog.codinglabs.org/articles/theory-of-mysql-index.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。