一、存储引擎
存储引擎:
查看mysql支持的存储引擎:show engines;
innodb: 支持事务
myisam: memory; 不支持事务
#查看数据库引擎
SHOW ENGINES;
二、事务
1. 事务的定义
#TCL
/*
Transaction Control Language 事务控制语言
事务:
一个或者一组sql语句组成一个执行单元,要么全部执行,要么全部不执行
案例:转账
张无忌 1000
赵敏 1000
update 表 set 张无忌的余额=500 where name='张无忌';
中断
update 表 set 赵敏的余额=1500 where name='赵敏';
*/
2. 事务的四大特性
事务的属性:ACID
1. 原子性:事务是一个不可分割的单位,要么全部执行,要么全部不执行
2. 一致性:数据库从一个一致状态变换到另外一个一致状态
3. 隔离性:一个事务的执行不能被其他事务干扰
4. 持久性:一个事务一旦被提交就不会改变。
3. 事务的创建
/*
事务的创建:
隐式事务:事务没有明显的开启和结束标记
比如 insert update delete语句
显式事务:事务具有明显的开启和结束标记
前提:必须先设置自动提交功能为禁用
set autocommit = 0;
查看事务是否自动提交
show variables like 'autocommit';
步骤1 开启事务
SET autocommit = 0; 必须的
START TRANSACTION; 可选的
步骤2 编写事务中的sql语句 (select insert update delete)
语句1;
语句2;
。。。
步骤3 结束事务
commit; 提交事务
rollback; 回滚事务
*/
CREATE TABLE ACCOUNT (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);
INSERT INTO ACCOUNT VALUES(NULL,'张无忌',1000),(NULL,'赵敏',1000);
#演示事务的使用步骤
#开启事务
SET autocommit = 0;
START TRANSACTION;
#编写一组sql语句
UPDATE `account` SET `balance`=5000 WHERE username='张无忌';
UPDATE `account` SET `balance`=1500 WHERE username='赵敏';
#结束事务
#commit;
ROLLBACK;
SELECT * FROM `account`;
4. 事务的并发问题
/*
事务的并发问题:
脏读:对于两个事务T1,T2。T1读取了T2修改但是还未提交的数据,则读取的数据就无效的
不可重复读:对于两个事务T1,T2。T1读取了一个数据后,T2修改了该数据,则T1读取的数据与之前不一致
幻读:对于两个事务T1,T2。T1读取数据后,T2修改了这个表的数据,则T1读取的数据就会发生变化
Oracle 支持2种事务的隔离级别 默认的为READ COMMITED,SERIALIZABLE
Mysql 支持4种事务的隔离级别: 默认为REPEATABLE READ
事务的隔离级别;
脏读 不可重复读 幻读
read uncommitted ✓ ✓ ✓
read committed ✓ ✓
repeatable read ✓
serializable
*/
#查看当前的隔离级别
SELECT @@transaction_isolation;
#设置隔离级别
#set session transaction isolation level REPEATABLE READ;
#savepoint 节点;设置保存点
#演示 savepoint 的使用
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `account` WHERE id = 1;
SAVEPOINT a;
DELETE FROM `account` WHERE id = 2;
ROLLBACK TO a;
SELECT * FROM `account`;