仅InnoDB存储引擎支持事务
一、事务的ACID属性
-
原子性(Atomicity)
事务是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生 -
一致性(Consistency)
事务必须使一个一致性状态变换到另一个一致性状态 -
隔离性(Isolation)
一个事务的执行不能被其他事务干扰,并发执行的各个事物之间不能相互干扰 -
持久性(Durability)
事务一旦被提交,对数据库的改变就是永久性的,后续的操作或异常都不应该对其产生影响
二、事务的创建
-
隐形事务
事务没有明显的开启和结束的标记(比如insert、update、delete语句) -
显示事务
事务具有明显的开启和结束的标记
前提:必须先设置事务的自动提交功能为禁用SET AUTOCOMMIT = 0;
步骤1:开启事务
SET AUTOCOMMIT= 0;
START TRANSACTION;
(可选)
步骤2:编写事务中的SQL语句(select、insert、update、delete)
语句1;
......
步骤3:结束事务
有两种结束事务的
COMMIT;
提交事务
ROLLBACK;
回滚事务
三、数据库的隔离级别
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
- 脏读(未提交的值变更):对于两个事务T1、T2,事务T1读取了已经被T2更新但还没有被提交的字段之后(事务T1未结束),事务T2执行了回滚(事务T2结束),事务T1读取的内容就是临时且无效的。
- 不可重复读(提交的值变更):对于两个事务T1、T2,事务T1读取了一个字段(事务T1未结束),然后事务T2更新了这个字段之后(事务T2结束),T1再次读取同一个字段(事务T1仍未结束),值就不同了
- 幻读(行变更):对于两个事务T1、T2,事务T1从一个表中读取了数据(事务T1未结束),然后事务T2在该表中插入了一些新的行(事务T2结束)。之后,如果T1再读取这个表(事务T1仍未结束),就会多出几行。
数据库提供的4种隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 描述 |
---|---|---|---|---|
读未提交(read uncommitted) | 是 | 是 | 是 | 允许事务T1读取T1执行中其他事务T2未提交的值变更及行变更,脏读、不可重复读、幻读问题均会出现 |
不可重复读(read committed) | 否 | 是 | 是 | 不允许事务T1未结束时,读取T1执行中其他事务T2未提交的值变更、未提交的行变更,不可重复读、幻读问题会出现 |
可重复读(repeatable read) | 否 | 否 | 是 | 不允许事务T1未结束时,读取T1执行中其他事务T2已提交的值变更,幻读问题会出现 |
串行化(serializable) | 否 | 否 | 否 | 不允许事务T1未结束时,读取T1执行中其他事务T2已提交的值\行变更 |
查询当前会话的事务隔离级别:
show variables like '%isolation%';
设置当前会话的事务隔离级别--不可重复读:
set session transaction isolation level read committed;
设置当前连接的事务隔离级别--可重复读:
set transaction isolation level repeatable read;
设置数据库系统全局事务隔离级别--串行化:
set global transaction isolation level serializable;
四、回滚点
设置回滚点
savepoint <回滚点名>
用法示例
set autocommit = 0;
start transaction;
delete from table1 where id = 1;
savepoint a;
delete from table2 where id = 1;
rollback to a;
网友评论