首页 > 技术文章 > 02事务

dongml05 2021-12-13 16:23 原文

事务

参考博客:https://blog.csdn.net/dengjili/article/details/82468576

什么是事务

  • 事务就是将一组SQL语句放在同一批次内去执行

  • 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行

  • MySQL事务处理只支持InnoDB和BDB数据表类型

事物原则(ACID)

原子性(atomicity)

要么都成功,要么都失败

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(consistency)

事务前后的数据完整性要保证一致

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性(isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,事务之间要相互隔离。

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性(durability)

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事物没有提交,恢复到原状

事物已经提交,持久化到数据库的

事物一旦提交不可逆

mysql安装步骤

 

事物的隔离级别

脏读:指一个事物读取了另外一个事物未提交的数据。

不可重复读:在一个事务内读取表中的某一行数据。

虚度(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

 

================================

--Mysql 是默认开启事务自动提交的

  
SET autocommit = 0 关闭

SET autocommit = 1 开启(默认)

START TRANSACTION --标记一个事务的开始,从这个之后的sql都在同一个事务内。

commit提交 rollback回滚

SAVEPOINT 保存点名--设置一个事务的保存点

ROLLBACK TO SAVEPOINT 保存点名 --回滚到保存点

RELEASE SAVEPOINT 保存点名  --撤销保存点
  1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

  2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;

  3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

  4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

  5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

推荐阅读