MySQL事务
2019-12-06 本文已影响0人
吃可爱长大鸭
MySQL-innodb-事务
事务主要针对DML语句
事务都是伴随着交易出现的
将一个执行的单元,划分为几个步骤
mysql> create table jiaoyi(name varchar(10),money int);
事务中执行的SQL语句,要么全部成功,如果有一条失败,则全部回滚。
事务的特性
A:原子性,将一个事务视为一个单元,要么全部成功(commit),要么全部失败(rollback)
C:一致性,在事务执行前后,数据保持一致
I:隔离性(隔离级别),事务和事务之间没有任何影响,完全隔离
D:持久性,事务执行结束后,commit的那一刻,写入磁盘,永久保存。
事务的生命周期
成功的事务:
begin;
SQL1
SQL2
SQL3
...
commit;
失败的事务:
begin;
SQL1
SQL2
SQL3
...
rollback;

事务的控制语句
#START TRANSACTION(或 BEGIN)# 开始一个新事务
mysql> start transaction;
mysql> select * from jiaoyi;
#SAVEPOINT #分配事务过程中的一个位置,以供将来引用
mysql> savepoint angzang;
#COMMIT #永久记录当前事务所做的更改
#ROLLBACK #取消当前事务所做的更改
#ROLLBACK TO SAVEPOINT #取消在 savepoint 之后执行的更改
mysql> rollback to savepoint angzang;
#RELEASE SAVEPOINT #删除 savepoint 标识符
#SET AUTOCOMMIT #为当前连接禁用或启用默认 autocommit 模式
### 事务的隐式提交
在MySQL5.6,不需要手动执行begin;只要执行DML语句,会自动开启一个事务
update、insert、delete
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" cid="n36" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
[root@db01 data]# vim /etc/my.cnf
autocommit=0
[root@db01 data]# /etc/init.d/mysqld restart
Shutting down MySQL.... SUCCESS!
Starting MySQL.. SUCCESS'
面试题
begin;
update
create database
update
select
insert
begin;
update
commit;
1.在事务执行期间,如果执行begin或者 start transaction会自动提交上一个事务,并且开启新的事务
2.在事务执行期间,如果运行了DDL和DCL都会自动提交事务
3.在事务执行期间,执行lock table 或者 unlock table 也会自动提交事务
4.导出数据 load data infile ,会自动提交事务
5.在事务执行期间,执行select for update,会自动提交事务
6.在autocommit=1的时候,会自动提交事务
事务日志-redo

WAL:write ahead log
日志优先写
-rw-rw---- 1 mysql mysql 50331648 12月 5 16:13 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 12月 5 16:13 ib_logfile1
事务日志-undo

-rw-rw---- 1 mysql mysql 79691776 12月 5 16:13 ibdata1
-rw-rw---- 1 mysql mysql 52428800 12月 5 15:37 ibdata2
SCR
