Transaction Control Language 事务控制语言
事务:一个或一组sql语言组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务由单独单元的一个或者多个SQL语句组成,在这个单元中,每个MYSQL语句是相互依赖的,而整个单独单元作为一个不可分割的整体,如果单元中某条 SQL 语句一旦执行失败或者产生错误,整个单元将会回滚。所有受到影响的数据返回到事务开始以前的状态。如果单元中的所有SQL语句均执行成功,则事务则被顺利执行
案例: 转账
张三丰: 1000元
郭襄 : 1000元
UPDATE TABLE SET 张三丰的余额 = 500 WHERE name="张三丰";
# 意外
UPDATE TABLE SET 郭襄的余额 = 1500 WHERE name = "郭襄";
# 全部失败
Mysql 的存储引擎
- 在mysql中的数据用各种不同的技术存储在文件或者内存中。
- 通过show engines; 来查看mysql 支持的存储引擎
- 在mysql中使用最多的存储引擎:
innodb
,myisam
,memory
, 其中 innodb 支持事务,而myisam 和 memory 不支持
事务的 ACID 属性
- 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生。 - 一致性(COnsistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态 - 隔离性(Isolation)
事务的隔离性是指一个事物的执行不能呗其他事务干扰,即一个事务内部操作及使用的数据对并发的其他事务时隔离的,并发执行的各个事务之间不能互相干扰 - 持久性(Durability)
持久性是指一个事务一旦被提交,他对数据库中的数据的改变就是永久性的。接下来的其他操作和数据库故障不应该对其有任何影响
事务的创建
隐式事务: 事务没有明显的开启和结束的标记
比如: insert
, update
,delete
显示事务: 事务具有明显的开始和结束的标记
前提: 必须先设置自动提交功能禁用
set autocommit = 0;
开启事务
set autocommit = 0;
start transaction; 可选的
# 编写事务中的sql 语句(SELECT , INSERT , UPDATE , DELETE )
语句 1,
语句 2,
。。。
# 结束实体
commit; # 提交事务
rollback; # 回滚事务
测试事务
use cbgk;
show tables;
SET AUTOCOMMIT = 0;
START transaction;
UPDATE asscount SET balance = 500 where username = '张无忌';
update asscount set balance = 1500 where username = '赵敏';
COMMIT;
select * from asscount ;
desc asscount;
对于同时运行的多个事务,当这些事物访问数据库相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
- 脏读: 对于两个事务,T1,T2, T1 读取了已经被T2更新但还
没有被提交
的字段,如果T2回滚,T1读取的内容就是临时且无效的。 - 不可重复读:对于两个事务T1,T2,T1 读取一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了
- 幻读: 对于两个事务T1,T2. T1 从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后。如果 T1 再次读取同一个表。就会多出几行
数据库事务的隔离性: 数据库系统必须具备隔离并发运行各个事物的能力,使他们不会相互影响。避免各种并发问题。
一个事务与其他事务隔离的程度称为隔离级别
,数据库规定了多种事务隔离级别。不同隔离级别对应不同的干扰程度。隔离级别越高,数据一致性越好。性能越弱
隔离级别
- 每启动一个mysql程序,就会单独获得一个数据库连接。每个数据库连接都有一个全局变量 @@tx_isolation, 表时当前的事务隔离级别。
- 查看当前的隔离级别:
SELECT @@tx_isolation;
- 设置当前Mysql连接的隔离级别
set transaction isolation level read committed;
- 设置数据库系统的全局的隔离级别:
set global transaction level read committed;
事务的隔离级别
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
seriablizable | × | × | × |
savepoint 的使用
演示 savepoint
set autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id = 25;
SAVEPOINT a; # 设置保存点
DELETE FROM account WHERE id = 28;
ROLLBACK TO a; ## 回滚到节点a
**执行完之后发现 id 25的被删除了。但是 id 28 的并没有被删除 **