事务(Transaction)
- 可以用来维护数据库的完整性,要么全部执行,要么全部不执行。
- 事务管理DDL、DML、DCL语句,增删改,默认自动提交。
- 开启事务:Start Transaction
insert、update、delete)执行时,标志事务开启
语句:begin
或者start transaction;
- 提交事务:Commit Transaction
成功的结束,将DML语句操作历史记录和底层硬盘数据同步
语句:commit;
- 回滚事务:Rollback Transaction
失败的结束,将DML语句操作历史记录清空
语句:rollback;
create database if not exists mydb_transaction;
use mydb_transaction;
create table if not exists account(
id int primary key,
name varchar(20),
money double
);
insert into account values(1, '张三', 1000);
insert into account values(2, '李四', 1000);
select @@autocommit;
set autocommit=0;
start transaction;
update account set money=money - 200 where id=1;
update account set money=money + 200 where id=2;
commit;
rollback;
事务的特性
- 原子性:事务不可分割,要么全部成功,要么全部失败。
- 一致性:事务前后的数据完整性保持一致。
- 隔离性:事务与事务之间是相互独立的,互不干扰。
隔离级别(越向下关联性越小):
1. read uncommitted:未提交读,最低隔离级别,一个事务可以读取另一个未提交的事务,会造成脏读。
2. read committed:已提交读,Oracle默认隔离级别,一个事务要等另一个事务提交后才能读取数据,会造成不可重复读。
3. repeatable read:可重复读,MySQL默认隔离级别,开始读取数据(事务开启)时,禁止其他事务对数据更新,会造成幻读。
4. serializable:序列化,最高隔离级别,事务串行执行,禁止其他事务并发操作数据,会造成长时间锁表。 - 持久性:事务一旦提交,数据将永久保存。
- 查看隔离级别
show variables like 'transaction_isolation';
- 设置隔离级别
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
锁机制
- 计算机协调多个进程或线程并发访问某一资源的机制。
- 按锁的粒度分为:表锁和行锁。
- 按锁的类别分为:共享锁和排他锁。
- 共享锁:读锁,多个事务可同时读取同一资源不会相互影响,但只能读不能写。
- 排它锁:写锁,一个事务对资源进行更新操作时,其他事务不能对该资源进行更新操作。
表锁
- 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。MyISAM、InnoDB都支持表锁。
- 在MySQL的查询语句select前,会自动给涉及的所有表加读锁,在MySQL的更新语句update、delete、insert前,会自动给涉及的所有表加写锁,在事务提交前,自动释放事务占用的所有锁。
- 表加读锁
lock tables emp read;
select * from emp;
select * from dept;
update emp set ename='张三' where empno=7369;
unlock tables;
lock tables emp write;
select * from emp;
update emp set ename='张三' where empno=7369;
unlock tables;
行锁(InnoDB)
- 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。只有InnoDB支持行锁。
- 对于update、delete、insert语句,InnoDB会自动给涉及数据加行排他锁;对于select语句,InnoDB不会加任何锁。
set autocommit=0;
start transaction;
update emp set ename='张三' where empno=7369;
commit;
日志
错误日志
- 记录启动、停止MySQL时出现的问题,重启MySQL时清空。
show variables like 'log_error%';
set global log_error=on;
set global log_error=off;
二进制日志
show variables like 'log_bin%';
show variables like 'binlog_format';
set global log_bin=on;
set global log_bin=off;
show binlog events;
show master status;
show master logs;
show binlog events in 'DESKTOP-I4G6UVE-bin.000001';
查询日志
show variables like 'general_log';
set global general_log=on;
set global general_log=off;
show variables like 'general_log_file';
慢查询日志
- 记录所有执行时间超过指定时间long_query_time值,并且扫描记录不小于min_examined_row_limit的SQL语句。
show variables like 'slow_query_log%';
set global slow_query_log=on;
show variables like 'long_query_time%';