目录
一、MySQL使用事务
二、自动提交策略
三、隐式提交语句
1、用于隐式提交的 SQL 语句:
2、导致提交的非事务语句:
3、导致隐式提交的语句示例:
四、开始事务流程
1、检查autocommit是否为关闭状态
2、开启事务,并结束事务
五、 InnoDB 事务的ACID保证
1、基本概念
2、redo log——重做日志
3、undo——回滚日志
1、开启事务(begin)
2、回滚事务(rollback)
将内存中,已执行过的操作,回滚回去
3、提交事务(commit)
完成一个事务,一旦事务提交成功 ,就说明具备ACID特性了。
MySQL默认已经开启自动提交,我们可以通过对应的设置来开启或者关闭自动提交。
自动提交是否打开,一般在有事务需求的MySQL中,将其关闭
不管有没有事务需求,我们一般也都建议设置为0,可以很大程度上提高数据库性能
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global autocommit=0;
Query OK, 0 rows affected (0.00 sec)
begin
a
b
begin
SET AUTOCOMMIT = 1
DDL语句: (ALTER、CREATE 和 DROP)
DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE
select @@autocommit;
或者:
show variables like 'autocommit';
begin
delete from student where name='alexsb';
update student set name='alexsb' where name='alex';
rollback;
begin
delete from student where name='alexsb';
update student set name='alexsb' where name='alex';
commit;
redo log 重做日志 ib_logfile0~1 50M 轮询使用
redo log buffer redo内存区域
ibd 存储 数据行和索引
buffer pool 缓冲区池,数据和索引的缓冲
LSN : 日志序列号
MySQL 每次数据库启动,都会比较磁盘数据页和redolog的LSN,必须要求两者LSN一致数据库才能正常启动
WAL——write ahead log 日志优先写的方式实现持久化
脏页——内存脏页,内存中发生了修改,没写入到磁盘之前,我们把内存页称之为脏页.
CKPT——Checkpoint,检查点,就是将脏页刷写到磁盘的动作
TXID——事务号,InnoDB会为每一个事务生成一个事务号,伴随着整个事务
作用——在事务ACID过程中,实现的是“D”持久化的作用。对于AC也有相应的作用
日志位置——redo的日志文件:iblogfile0 iblogfile1
reduo buffer
redo的buffer:数据页的变化信息+数据页当时的LSN号
LSN:日志序列号 磁盘数据页、内存数据页、redo buffer、redolog
刷新策略 —— commit;
刷新当前事务的redo buffer到磁盘
还会顺便将一部分redo buffer中没有提交的事务日志也刷新到磁盘
作用:
在事务ACID过程中,实现的是“A” 原子性的作用
另外CI也依赖于Undo
在rolback时,将数据恢复到修改之前的状态
在CSR实现的是,将redo当中记录的未提交的时候进行回滚.
undo提供快照技术,保存事务修改之前的数据状态.保证了MVCC,隔离性,mysqldump的热备
对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含 3 个隐藏列
db_row_id:隐藏的行 ID。在没有自定义主键也没有 Unique 键的情况下,会使用该隐藏列作为主键。
db_trx_id:操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。
db_roll_ptr:回滚指针,也就是指向这个记录的 Undo Log 信息。Undo Log 中存储了回滚需要的数据