TCL事务控制语言


1 存储引擎

1-1 存储引擎的使用
  • 数据库中的各表均被(在创建表时)指定的存储引擎处理
  • 服务器可用的引擎依赖于以下因素
    • mysql的版本
    • 服务器在开发时如何被配置
    • 启动选项
  • 为了解当前服务器中有哪些存储引擎可用,可使用show engines;语句
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

注意:完整的建表语句

create table <表名> (
	<字段>  [类型]  (约束))engines = <存储引擎> default charset = utf-8;

查询存储引擎

show engines;

2 常见的存储引擎

2-1 mytsam------mysql最常见的引擎—但不是默认的

  • 管理的表具有以下特征

    • 使用三个文件表示表

      • 格式文件-存储表结构的定义(.frm)
      • 数据文件-存储表行的内容(.MYD)
      • 索引文件-存储表上的索引(.MYI)
    • 灵活的auto_increment字段处理

    • 可被转换为压缩,只读来节省空间

  • 不支持事务


2-2 inondb-------mysql默认存储引擎

  • 支持事务

  • 最安全

  • 行级锁、外键

  • 处理速度较快的


2-3 memory

  • 不支持事务,数据容易丢失,因为数据、索引都是存储在内存当中的
  • 查询速度最快



3 事务(transaction)

3-1 事务概述

  • 一个事务是一个完整的业务逻辑单元,不可再分。

  • 要想保证两条DML语句同时成功或者同时失败,那么就需要使用数据库的事务机制

  • 事务只针对dml命令(insert delete updata)


3-2 事务的原理

一个事务可以一个业务功能,可以由多个dml指令构成

创建一个事务

开始事务机制

执行事务操作

提交事务或者回滚事务(commit rollback)savapoint(事务保存节点)

类似于git工具的代码存储暂存区可以提交,可以回转历史版本




3-3 事务的三大特性

  • 原子性-----A

事务时最小的工作单元,不可再分

  • 一致性------C

事务必须保证多条dml语句同时成功或者同时失败

  • 隔离性------I

事务a与事务b之间具有隔离

  • 持久性------D

持久性说的是最终的数据必须持久化到硬盘文件中,事务才算是成功的结束




3-4 关于事务的隔离性

事务的隔离性存在隔离级别,理论上隔离级别包括4个:

  • 第一级别读未提交(read uncommitted)

​ 对方事务还没有提交,我们当前事务可以读取到对方未提交的数据

​ 读未提交存在脏读现象,表示读到了脏的数据

​ 当事务还没有提交时,读取读到的是缓存中的数据,因为可以回滚和删除,这导致事务读取的极其不稳定

  • 第二级别读已提交(read commitied)

    ​ 对方的事务提交之后的数据我们可以读取到。

    ​ 解决了脏读问题

    ​ 存在问题:不可重复读。

  • 第三阶段可重复读(repeatable read)

    ​ 解决了不可重复读的问题

    ​ 存在问题:读到的数据都是事务开启时的数据

  • 第四级别序列化/串行化读

    ​ 解决了所有问题

    ​ 效率低。需要事务排队

    ​ 一个事务未完成之前第二个事务是无法开启的

演示事务

  • MySQL事务在默认情况下是自动提交的。

    ​ (自动提交?只要执行任意一条dml语句则提交一次)

    关闭自动提交?

    ​ start transaction;

mysql> select *from t_transcation;
+----+------+
| id | name |
+----+------+
|  1 | lisi |
+----+------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select*from t_transcation;
+----+------+
| id | name |
+----+------+
|  1 | lisi |
+----+------+
1 row in set (0.00 sec)

因为mysql默认执行一句dml就提交一次,所以回滚是回不到之前的状态

开启自动提交

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

事务未提交时是可以回滚的

mysql> insert into t_transcation (name) values("tom");
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_transcation;
+----+------+
| id | name |
+----+------+
|  1 | lisi |
|  2 | tom  |
+----+------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_transcation;
+----+------+
| id | name |
+----+------+
|  1 | lisi |
+----+------+
1 row in set (0.00 sec)

提交事务

mysql> insert into t_transcation(name) values ("tom");
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_transcation;
+----+------+
| id | name |
+----+------+
|  1 | lisi |
|  3 | tom  |
+----+------+
2 rows in set (0.00 sec)

注意:回滚事务之只能回到事务开始时的状态 且回滚后主键的值也会改变

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值