InnoDB事务与锁

什么是事务?

MySQL :: MySQL 8.0 参考手册 :: MySQL 词汇表

  • TPS:"每秒事务数"的缩写。
事务
  • 事务是可以提交或回滚的原子工作单元。单条或多条SQL语句都属于是一个工作单元。
  • 当事务对数据库进行多次更改时,要么在提交事务时所有更改都成功,要么在回滚事务时所有更改都撤销。
  • 由InnoDB实现的数据库事务具体统称为ACID的属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolctaion)和持久性(Durability)。
  • 一致性也可以保证在集群架构下主从是一致的。
  • 持久性是去保证一致性的前提,持久性:我去做任何数据的更改都会持久化到磁盘,不会因为断电而导致数据的丢失。
  • RedoLog重做日志是去保证持久性的,即持久性通过RedoLog重做日志实现,因为如果你在内存里面更改了以后没有同步到磁盘,假如发生宕机,就会导致数据丢失,如果发生数据丢失,一致性就保证不了了。
两阶段提交
  • 在XA规范下,作为分布式事务的一部分的操作(有时缩写为2PC)。
  • 当多个数据库参与事务时,要么所有数据库提交更改,要么所有数据库回滚更改。

开启、提交、回滚事务 

MySQL :: MySQL 8.0 Reference Manual :: 13.3.1 START TRANSACTION, COMMIT, and ROLLBACK Statements

隐式自动提交  

  • 我们知道,一条或多条SQL语句,都是属于一个工作单元,那为什么我们平时写SQL语句的时候,不需要手动去写start transaction或者begin来开启事务呢?
  • 这是因为在我们的MySQL里面,事务是默认自动提交的,也就是说,当执行一条DML语句时,MySQL会立即隐式的提交事务。 

查询是否开启自动提交事务 

-- 查询是否开启自动提交事务
-- autocommit是MySQL数据库中的会话变量,用于控制每个语句是否自动提交为一个单独的事务
-- 如果autocommit的值为1或ON,则表示启动了自动提交(默认情况下),每个DML语句都都将作为一个独立的事务自动提交
-- 如果autocommit的值为0或OFF,则表示禁用了自动提交,需要手动使用commit或rollback命令提交或回滚事务

-- 用于显示当前会话中的autocommit变量的值
show session variables like 'autocommit'; -- ON

-- 用于显示全局配置中的autocommit变量的值,全局配置是MySQL数据库的整体配置设置,将影响所有连接和会话
show global variables like 'autocommit'; -- ON

关闭自动提交事务(一般不会关闭...)

-- 关闭自动提交事务
set session autocommit = 0;
set session autocommit = OFF;

不能回滚的语句(来自官网原语) 

MySQL :: MySQL 8.0 Reference Manual :: 13.3.2 Statements That Cannot Be Rolled Back

  • 有些语句无法回滚,一般来说,这些包括DDL - 数据定义语言(data definition language, DDL)语句,例如创建或删除数据库的语句。

SavePoint回滚点

  • 事务是保证单条或者多条SQL语句要么同时执行成功,要么全部回滚。
  • 其实,InnoDB是支持回滚点的操作的,何为回滚点,就是我可以回滚部分操作、提交部分操作。
-- 开启事务
start transaction;
-- DML操作
update table set age = age + 1 where id = 2;
-- 设置回滚点,如果回滚回滚点,后续内容将会被回滚
savepoint sp;
-- DML操作
update table set age = age + 1 where id = 1;
-- 回滚到回滚点,id = 1的DML语句不生效,但是不代表事务结束,事务结束还需要commit或者rollback
rollback to sp;
-- 提交事务
commit;

InnoDB和ACID模型

  • ACID模型是一组数据库设计原则强调对业务数据和关键任务应用程序非常重要的可靠性方面。
  • MySQL包含了一些组件,比如紧密遵循ACID模型的InnoDB存储引擎,这样在软件崩溃和硬件故障等异常情况下,数据不会被破坏,结果也不会被扭曲。

下面将讨论MySQL的特性,特别是InnoDB存储引擎如何与ACID模型的类别进行交互:

Atomicity - 原子性
  • ACID模型的原子性,主要涉及到的是InnoDB存储引擎的事务。
  • 原子性是指事务是一个不可分割的工作单元,事务中的操作要么同时执行成功,要么全部回滚,即事务是保证单条或多条SQL语句要么同时执行成功,要么全部回滚。
  • 相关的MySQL功能包括:自动提交设置、COMMIT语句、ROLLBACK语句。
  • 原子性是依靠UndoLog回滚日志来实现的,每次对数据做修改、删除或插入的操作都会生成一条UndoLog日志来记录操作之前的数据状态,使用ROLLBACK的语句能够将所有执行成功的SQL语句产生的效果撤回。
  • 回滚日志先于数据持久化到磁盘或硬盘上,回滚就是逆向操作。
  • 注意:这里的原子性跟并发的原子性是有一定区别的,并发的原子性是我在执行一个操作的时候,其它线程就不能来操作相关的资源,必须等我释放这些资源后才能来操作。
Consistency - 一致性
  • 所谓一致性,就是保证数据的一致,也就是保证数据不要丢失,不会因为突然的断电等导致数据与我想要的数据不一致,以保护数据不受崩溃的影响。
  • 相关的MySQL功能体现:DoubleWrite-Buffer(双写缓冲区,保证内存跟磁盘之间同步的数据安全)、基于RedoLog的数据恢复。
Isolation - 隔离性
  • ACID模型的隔离性主要涉及InnoDB事务,特别是应用于每个事务的隔离级别。
  • 事务的隔离性是指多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其它事务的操作数据所干扰,多个并发事务之间要隔离。
  • 相关的MySQL功能包括:事务的隔离级别以及InnoDB锁的底层细节。
  • 隔离性通过锁机制实现,当事务操作数据的时候加锁,让事务执行前后看到的数据是一致的,并行执行事务和串行执行事务产生的效果一样,另外就是利用MVCC实现的快照读。
Durability - 持久性
  • ACID模型的持久性涉及MySQL软件特性与特定硬件配置的交互。
  • 持久性,其实就是我的数据要尽可能地同步到磁盘做持久化保存,防止数据异常丢失,一个事务一旦被提交,它对数据库中的数据的改变就是永久性的,即使接下来数据库发生故障也不会对其有影响。
  • 相关的MySQL功能包括:InnoDB的DoubleWrite-Buffer - 双写缓冲区、RedoLog的同步机制设置(innodb_flush_log_at_trx_commit变量- 有0、1、2,默认值为1,设置为1才可以做持久化保存,如果设置为0跟2,可能会有数据丢失) 、binlog的同步机制(sync_binlog变量)、独立表空间或系统表空间设置(innodb_file_per_table变量,默认开启为独立表空间,如果关闭为系统表空间)。
  • 持久性是通过RedoLog重做日志实现的,RedoLog记录的是对数据库的操作,MySQL先把存放在磁盘上的数据加载到内存中,在内存中做修改再刷回到磁盘,RedoLog使得再事务提交时将数据刷回磁盘。

你可能感兴趣的:(数据库,java,mysql)