当前位置:   article > 正文

MySQL索引与事务_mysql在事务中唯一索引和索引

mysql在事务中唯一索引和索引

目录

一、索引

1、索引的作用

2、索引的分类

2.1、主键索引

2.2、唯一索引

2.3、普通索引

2.4、全文索引

3、索引的删除

二、MySQL事务

1、概念

2、事务的ACID特点

2.1、原子性

2.2、一致性

2.3、隔离性

2.4、持久性

3、事务之间的相互影响

4、MySQL事务隔离级别

4.1、查询全局事务隔离级别


一、索引

1、索引的作用

  • 提高查询速度

  • 确保数据的唯一性

  • 可以加速表和表之间的连接 , 实现表与表之间的参照完整性

  • 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间

  • 全文检索字段进行搜索优化

2、索引的分类

实验需求,先在AAA数据库下创建一个member的表

  1. mysql> select * from member;
  2. +------+----------+---------+--------+----------+----------------+
  3. | id | name | cardid | phone | address | remark |
  4. +------+----------+---------+--------+----------+----------------+
  5. | 1 | zhangsan | 123 | 111111 | nanjing | this is vip |
  6. | 4 | lisi | 1234 | 444444 | nanjing | this is normal |
  7. | 2 | wangwu | 12345 | 222222 | benjing | this is normal |
  8. | 5 | zhaoliu | 123456 | 555555 | nanjing | this is vip |
  9. | 3 | qianqi | 1234567 | 333333 | shanghai | this is vip |
  10. | 6 | liuyi | 123456 | 666666 | nanjing | this is vip |
  11. | 7 | laoba | 1234567 | 888888 | shanghai | this is vip |
  12. +------+----------+---------+--------+----------+----------------+
  13. 7 rows in set (0.00 sec)
  • 主键索引 (Primary Key)

  • 唯一性索引 (Unique)

  • 普通索引

  • 单列索引与多列索引

  • 全文索引 (FullText)

2.1、主键索引

主键 : 某一个属性组能唯一标识一条记录,不允许有空值

特点 :

  • 最常见的索引类型

  • 确保数据记录的唯一性

  • 确定特定数据记录在数据库中的位置

①修改表方式创建主键索引

语法格式:

ALTER TABLE 表名 ADD PRIMARY KEY (列名);

  1. ### 创建主键索引
  2. mysql> alter table member add primary key (id);
  3. Query OK, 0 rows affected (0.04 sec)
  4. Records: 0 Duplicates: 0 Warnings: 0
  5. ### 查看主键索引
  6. mysql> show create table member;
  7. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  8. | Table | Create Table |
  9. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  10. | member | CREATE TABLE "member" (
  11. "id" int(10) NOT NULL,
  12. "name" varchar(10) DEFAULT NULL,
  13. "cardid" varchar(18) DEFAULT NULL,
  14. "phone" varchar(11) DEFAULT NULL,
  15. "address" varchar(50) DEFAULT NULL,
  16. "remark" text,
  17. PRIMARY KEY ("id"), ####主键索引
  18. UNIQUE KEY "phone_index" ("phone"), ####唯一索引
  19. KEY "name_index" ("name"), ####普通索引
  20. KEY "cardid_index" ("cardid") ####普通索引
  21. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  22. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  23. 1 row in set (0.00 sec)

②在创建表的时候,直接指定主键索引

语法格式:

CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

2.2、唯一索引

唯一索引:避免同一个表中某数据列中的值重复

唯一索引与主键索引的区别

  • 主键索引只能有一个

  • 唯一索引可能有多个

 ①以直接创建的方式创建唯一索引

语法格式:CREATE UNIQUE INDEX 索引名 ON 表名(列名);

需求:创建phone字段的唯一索引

  1. mysql> create unique index phone_index on member (phone);
  2. Query OK, 0 rows affected (0.00 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0
  4. mysql> mysql> show create table member;
  5. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  6. | Table | Create Table |
  7. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  8. | member | CREATE TABLE "member" (
  9. "id" int(10) DEFAULT NULL,
  10. "name" varchar(10) DEFAULT NULL,
  11. "cardid" varchar(18) DEFAULT NULL,
  12. "phone" varchar(11) DEFAULT NULL,
  13. "address" varchar(50) DEFAULT NULL,
  14. "remark" text,
  15. UNIQUE KEY "phone_index" ("phone"),
  16. KEY "name_index" ("name"),
  17. KEY "cardid_index" ("cardid")
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  19. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  20. 1 row in set (0.00 sec)

②修改表的方式进行修改

语法格式:

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);  (参考普通索引的第二种方式)

③在创建表时就指定唯一索引

语法格式:

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

###  操作方法参考普通索引的第三种方式

2.3、普通索引

作用 : 快速定位特定数据,没有任何约束

①以直接创建方式创建索引:

语法格式:CREATE INDEX 索引名 ON 表名 (列名[(length)]);

需求:创建一个name_index的索引

  1. mysql> create index name_index on member (name);
  2. 创建 索引 索引名 在 表名 需要创建索引的字段名
  3. Query OK, 0 rows affected (0.02 sec)
  4. Records: 0 Duplicates: 0 Warnings: 0
  5. mysql> select name from member; ### 使用索引
  6. +----------+
  7. | name |
  8. +----------+
  9. | laoba |
  10. | lisi |
  11. | liuyi |
  12. | qianqi |
  13. | wangwu |
  14. | zhangsan |
  15. | zhaoliu |
  16. +----------+
  17. 7 rows in set (0.00 sec)
  18. mysql> show create table member;
  19. +--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  20. | Table | Create Table |
  21. +--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  22. | member | CREATE TABLE "member" (
  23. "id" int(10) DEFAULT NULL,
  24. "name" varchar(10) DEFAULT NULL,
  25. "cardid" varchar(18) DEFAULT NULL,
  26. "phone" varchar(11) DEFAULT NULL,
  27. "address" varchar(50) DEFAULT NULL,
  28. "remark" text,
  29. KEY "name_index" ("name") ############### 刚创建的name字段的索引
  30. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  31. +--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  32. 1 row in set (0.00 sec)

②以修改表结构的方式创建索引:

语法格式:ALTER TABLE 表名 ADD INDEX 索引名 (列名);

需求:创建一个cardid字段的普通索引

  1. mysql> alter table member add index cardid_index (cardid);
  2. #以修改表结构的方式,增加普通索引
  3. Query OK, 0 rows affected (0.01 sec)
  4. Records: 0 Duplicates: 0 Warnings: 0
  5. mysql> select cardid from member; ## 使用索引
  6. +---------+
  7. | cardid |
  8. +---------+
  9. | 123 |
  10. | 1234 |
  11. | 12345 |
  12. | 123456 |
  13. | 123456 |
  14. | 1234567 |
  15. | 1234567 |
  16. +---------+
  17. 7 rows in set (0.00 sec)
  18. mysql> show create table member;
  19. +--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  20. | Table | Create Table |
  21. +--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  22. | member | CREATE TABLE "member" (
  23. "id" int(10) DEFAULT NULL,
  24. "name" varchar(10) DEFAULT NULL,
  25. "cardid" varchar(18) DEFAULT NULL,
  26. "phone" varchar(11) DEFAULT NULL,
  27. "address" varchar(50) DEFAULT NULL,
  28. "remark" text,
  29. KEY "name_index" ("name"),
  30. KEY "cardid_index" ("cardid") ###### 刚创建的cardid字段的索引
  31. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  32. +--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  33. 1 row in set (0.00 sec)

③在创建表时就设立索引

语法格式:

CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

需求:创建ceshi表,指定name字段为普通索引

  1. ### 创建表的结构,且建立需要的索引name字段
  2. mysql> create table ceshi(id int(4),name varchar(40),dizhi varchar(50),index name_index (name));
  3. Query OK, 0 rows affected (0.01 sec)
  4. 插入表的内容
  5. mysql> insert into ceshi values(1,'zhangyi','nanjing');
  6. Query OK, 1 row affected (0.00 sec)
  7. mysql> insert into ceshi values(2,'zhanger','beijing');
  8. Query OK, 1 row affected (0.00 sec)
  9. mysql> insert into ceshi values(3,'zhangsan','beijing');
  10. Query OK, 1 row affected (0.00 sec)
  11. mysql> insert into ceshi values(3,'zhangsi','shanghai');
  12. Query OK, 1 row affected (0.00 sec)
  13. mysql> insert into ceshi values(3,'zhangwu','shanghai');
  14. Query OK, 1 row affected (0.01 sec)
  15. 使用索引进行查询:
  16. mysql> select name from ceshi;
  17. +----------+
  18. | name |
  19. +----------+
  20. | zhanger |
  21. | zhangsan |
  22. | zhangsi |
  23. | zhangwu |
  24. | zhangyi |
  25. +----------+
  26. 5 rows in set (0.00 sec)
  27. ### 查看表的详细信息及索引
  28. mysql> show create table ceshi;
  29. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  30. | Table | Create Table |
  31. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  32. | ceshi | CREATE TABLE "ceshi" (
  33. "id" int(4) DEFAULT NULL,
  34. "name" varchar(40) DEFAULT NULL,
  35. "dizhi" varchar(50) DEFAULT NULL,
  36. KEY "name_index" ("name") ### 创建表时,创建的索引
  37. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  38. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  39. 1 row in set (0.00 sec)

2.4、全文索引

作用 : MySQL 自带的全文索引只能用于 InnoDB、MyISAM ,并且只能对英文进行全文检索

注意 :

  • 只能用于MyISAM类型的数据表

  • 只能用于CHAR , VARCHAR , TEXT数据列类型

  • 适合大型数据集

①在创建表的时候直接指定创建

语法格式:

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));

                               #数据类型可以为 CHAR、VARCHAR 或者 TEXT

  1. CREATE TABLE table_name ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, author VARCHAR(200),title VARCHAR(200), content TEXT(500), FULLTEXT full_index_name (col_name) )
  2. mysql> show create table table_name;
  3. +------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  4. | Table | Create Table |
  5. +------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  6. | table_name | CREATE TABLE "table_name" (
  7. "id" int(10) unsigned NOT NULL AUTO_INCREMENT,
  8. "author" varchar(200) DEFAULT NULL,
  9. "title" varchar(200) DEFAULT NULL,
  10. "content" text,
  11. PRIMARY KEY ("id"),
  12. FULLTEXT KEY "full_index_name" ("author")
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  14. +------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  15. 1 row in set (0.00 sec)

② 修改表方式创建

语法格式:

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

3、索引的删除

①直接删除索引

语法格式:  DROP INDEX 索引名 ON 表名;

  1. mysql> show create table member;
  2. '''''''''''''''''''''''''''''''''''''''
  3. | member | CREATE TABLE "member" (
  4. "id" int(10) NOT NULL,
  5. "name" varchar(10) DEFAULT NULL,
  6. "cardid" varchar(18) DEFAULT NULL,
  7. "phone" varchar(11) DEFAULT NULL,
  8. "address" varchar(50) DEFAULT NULL,
  9. "remark" text,
  10. PRIMARY KEY ("id"),
  11. UNIQUE KEY "phone_index" ("phone"),
  12. KEY "name_index" ("name"), #### 此时索引名位name_index还存在
  13. KEY "cardid_index" ("cardid")
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  15. ..........................................
  16. 1 row in set (0.00 sec)
  17. ### 删除索引
  18. mysql> drop index name_index on member; #### 删除名字为name_index的索引
  19. Query OK, 0 rows affected (0.00 sec)
  20. Records: 0 Duplicates: 0 Warnings: 0
  21. mysql> show create table member;
  22. .........................................
  23. member | CREATE TABLE "member" (
  24. "id" int(10) NOT NULL,
  25. "name" varchar(10) DEFAULT NULL,
  26. "cardid" varchar(18) DEFAULT NULL,
  27. "phone" varchar(11) DEFAULT NULL,
  28. "address" varchar(50) DEFAULT NULL,
  29. "remark" text,
  30. PRIMARY KEY ("id"),
  31. UNIQUE KEY "phone_index" ("phone"),
  32. KEY "cardid_index" ("cardid")
  33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  34. ...............................................................
  35. 1 row in set (0.00 sec)

②修改表方式删除索引

语法格式:

ALTER TABLE 表名 DROP INDEX 索引名;

  1. mysql> drop index name_index on member;
  2. Query OK, 0 rows affected (0.00 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0
  4. mysql> show create table member;
  5. +--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  6. | Table | Create Table |
  7. +--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  8. | member | CREATE TABLE "member" (
  9. "id" int(10) NOT NULL,
  10. "name" varchar(10) DEFAULT NULL,
  11. "cardid" varchar(18) DEFAULT NULL,
  12. "phone" varchar(11) DEFAULT NULL,
  13. "address" varchar(50) DEFAULT NULL,
  14. "remark" text,
  15. PRIMARY KEY ("id"),
  16. UNIQUE KEY "phone_index" ("phone"),
  17. KEY "cardid_index" ("cardid")
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  19. +--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  20. 1 row in set (0.00 sec)
  21. mysql> alter table member drop index cardid_index;
  22. Query OK, 0 rows affected (0.00 sec)
  23. Records: 0 Duplicates: 0 Warnings: 0

③删除主键索引

语法格式:

ALTER TABLE 表名 DROP PRIMARY KEY;

  1. mysql> alter table CLASS.member DROP PRIMARY KEY;
  2. Query OK, 7 rows affected (0.01 sec)
  3. Records: 7 Duplicates: 0 Warnings: 0
  4. mysql> show create table member;
  5. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  6. | Table | Create Table |
  7. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  8. | member | CREATE TABLE "member" (
  9. "id" int(10) NOT NULL,
  10. "name" varchar(10) DEFAULT NULL,
  11. "cardid" varchar(18) DEFAULT NULL,
  12. "phone" varchar(11) DEFAULT NULL,
  13. "address" varchar(50) DEFAULT NULL,
  14. "remark" text,
  15. UNIQUE KEY "phone_index" ("phone")
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  17. +--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  18. 1 row in set (0.00 sec)

二、MySQL事务

1、概念

①是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行

②是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

③适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。

④通过事务的整体性以保证数据的一致性。

2、事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)。这是可靠数据库所应具备的几个特性。

2.1、原子性

指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

①事务是一个完整的操作,事务的各元素是不可分的。

②事务中的所有元素必须作为一个整体提交或回滚。

③如果事务中的任何元素失败,则整个事务将失败。

2.2、一致性

指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏

①当事务完成时,数据必须处于一致状态。

②在事务开始前,数据库中存储的数据处于一致状态。

③在正在进行的事务中,数据可能处于不一致的状态。

④当事务成功完成时,数据必须再次回到已知的一致状态。

2.3、隔离性

指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

①对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
②修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

2.4、持久性

①指不管系统是否发生故障,事务处理的结果都是永久的。

②一旦事务被提交,事务的效果会被永久地保留在数据库中。

3、事务之间的相互影响

一个事务的执行不能被其他事务干扰,事务之间的相互影响分为几种,分别为:

①脏读(读取未提交数据):脏读是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据x,在未提交前,事务a读取了x,而事务B却回滚了,这样事务A就形成了脏读。也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

②不可重复读(前后多次读取,数据内容不一致):一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的,事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化。

③幻读(前后多次读取,数据总量不一致):一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

④丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

4、MySQL事务隔离级别

read uncommitted (未提交度): 读取尚未提交的数据 :不解决脏读
read committed(提交读):读取已经提交的数据 :可以解决脏读
repeatable read:(可重复读):可以解决脏读 和 不可重复读 —mysql默认的
serializable:串行化:可以解决脏读、不可重复读和虚读—相当于锁表

MySQL默认的事务处理级别是 repeatable read , 而oracle和SQL Server是 read committed 

5、事务控制语句

BEGIN:表示开启一个事务

COMMIT:提交事务,并使已对数据库进行的所有修改为永久性的

ROLLBACK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改

SAVEPOINT S1:使用SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个

(SAVEPOINT:"S1"代表回滚点名称,ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。)

(在正常情况下,我们在MySQL数据库中,一条命令执行完,回车即代表完成一个事务,我们可以用BEGIN和COMMIT来做测试)

实验环境:

  1. mysql> show databases; ### 显示MySQL服务器上的所有数据库
  2. +--------------------+
  3. | Database |
  4. +--------------------+
  5. | information_schema |
  6. | AAA |
  7. | CLASS |
  8. | class |
  9. | mysql |
  10. | performance_schema |
  11. | sys |
  12. | zwb | ### 我们需要实验使用的数据库
  13. +--------------------+
  14. 8 rows in set (0.00 sec)
  15. mysql> use zwb; ### 使用zwb数据库
  16. Database changed
  17. mysql> show tables; ### 显示zwb数据库内的所有表
  18. +---------------+
  19. | Tables_in_zwb |
  20. +---------------+
  21. | info |
  22. +---------------+
  23. 1 row in set (0.00 sec)
  24. mysql> select * from info; ### 查看info表的内容
  25. +----+------+-------+
  26. | id | name | money |
  27. +----+------+-------+
  28. | 1 | Aa | 2000 |
  29. | 2 | 2Aa | 2000 |
  30. +----+------+-------+
  31. 2 rows in set (0.00 sec)

测试一:使用begin开始,不使用commit结束会是什么样的结果?

使用comity语句后

 

测试二:

rollback回滚的使用

  1. mysql> select * from info; ### 显示info表最初含有的内容
  2. +----+------+-------+
  3. | id | name | money |
  4. +----+------+-------+
  5. | 1 | Aa | 2000 |
  6. | 2 | 2Aa | 2000 |
  7. | 3 | 3A | 2500 |
  8. +----+------+-------+
  9. 3 rows in set (0.00 sec)
  10. mysql> begin; ### 开始定义一个事务
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql> insert into info values(4,'4A',2000); ### 插入一个记录
  13. Query OK, 1 row affected (0.00 sec)
  14. mysql> savepoint d1; ### 定义一个回滚点 d1
  15. Query OK, 0 rows affected (0.00 sec)
  16. mysql> insert into info values(5,'5A',2000); ### 插入一个记录
  17. Query OK, 1 row affected (0.00 sec)
  18. mysql> savepoint d2; ### 定义一个回滚点 d2
  19. Query OK, 0 rows affected (0.00 sec)
  20. mysql> select * from info; ### 查看info内容,之前的操作都在,但是没有
  21. commit提交,如果需要保存到数据库,使用commit提交
  22. +----+------+-------+
  23. | id | name | money |
  24. +----+------+-------+
  25. | 1 | Aa | 2000 |
  26. | 2 | 2Aa | 2000 |
  27. | 3 | 3A | 2500 |
  28. | 4 | 4A | 2000 |
  29. | 5 | 5A | 2000 |
  30. +----+------+-------+
  31. 5 rows in set (0.00 sec)
  32. mysql> rollback to savepoint d1; ### 执行回滚,回滚到d1处
  33. Query OK, 0 rows affected (0.00 sec)
  34. mysql> select * from info; ### 查看info表的内容发现d1后面的所有操作记录都没有了
  35. +----+------+-------+
  36. | id | name | money |
  37. +----+------+-------+
  38. | 1 | Aa | 2000 |
  39. | 2 | 2Aa | 2000 |
  40. | 3 | 3A | 2500 |
  41. | 4 | 4A | 2000 |
  42. +----+------+-------+
  43. 4 rows in set (0.00 sec)
  44. mysql> rollback; ### 直接回滚,后面不加回滚点,则直接撤销之前的所有操作
  45. Query OK, 0 rows affected (0.00 sec)
  46. mysql> select * from info; ### 操作全部撤销
  47. +----+------+-------+
  48. | id | name | money |
  49. +----+------+-------+
  50. | 1 | Aa | 2000 |
  51. | 2 | 2Aa | 2000 |
  52. | 3 | 3A | 2500 |
  53. +----+------+-------+
  54. 3 rows in set (0.01 sec)
  55. ###正常回滚,执行保存的操作
  56. mysql> insert into info values(4,'4A',2000); ## 添加一个记录
  57. Query OK, 1 row affected (0.00 sec)
  58. mysql> savepoint d1; ## 设立d1回滚点
  59. Query OK, 0 rows affected (0.00 sec)
  60. mysql> insert into info values(5,'5A',2000); ## 添加一个记录
  61. Query OK, 1 row affected (0.00 sec)
  62. mysql> savepoint d2; ## 设立d2回滚点
  63. Query OK, 0 rows affected (0.00 sec)
  64. mysql> rollback to savepoint d1; ## 回滚到d1处,撤销了d1以后的操作
  65. Query OK, 0 rows affected (0.00 sec)
  66. mysql> commit; ## 提交保存到数据库
  67. Query OK, 0 rows affected (0.00 sec)
  68. mysql> select * from info;
  69. +----+------+-------+
  70. | id | name | money |
  71. +----+------+-------+
  72. | 1 | Aa | 2000 |
  73. | 2 | 2Aa | 2000 |
  74. | 3 | 3A | 2500 |
  75. | 4 | 4A | 2000 |
  76. +----+------+-------+
  77. 4 rows in set (0.00 sec)

6、使用set设置控制事务

MySQL默认使自动提交事务的,回车便是提交一个事务。也可以修改为不自动提交。使用set操作命令:

set autocommit = 0:禁止自动提交

set autocommit = 1 :开启自动提交

  1. mysql> set autocommit = 0; ## 开启禁止自动提交事务
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> insert into info values(6,'6A',2000); ## 新增一条记录
  4. Query OK, 1 row affected (0.00 sec)
  5. mysql> commit; ## 提交事务,保存到数据库(如果不commit提交事务,
  6. 则无法保存到数据库)
  7. Query OK, 0 rows affected (0.00 sec)
  8. mysql> select * from info; ## 查看表内容
  9. +----+------+-------+
  10. | id | name | money |
  11. +----+------+-------+
  12. | 1 | Aa | 2000 |
  13. | 2 | 2Aa | 2000 |
  14. | 3 | 3A | 2500 |
  15. | 4 | 4A | 2000 |
  16. | 5 | 5A | 2000 |
  17. | 6 | 6A | 2000 |
  18. +----+------+-------+
  19. 6 rows in set (0.00 sec)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/402768
推荐阅读
相关标签
  

闽ICP备14008679号