1、事务
事务(Transaction)是一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元
(1)事务的语法
(2)事务的特性
(3)事务的并发问题
(4)事务的隔离级别
1.1、事务的语法
1. 开启事务
start transaction;
begin;
2. 使得当前的修改确认
commit;
3. 使得当前的修改被放弃(回滚)
rollback; 注意:回滚操作要在确认操作前
1.2 事务的ACID特性
1. 原子性(Atomicity)
事务的原⼦性是指事务必须是⼀个原子的操作序列单元。事务中包含的各项操作在⼀次执⾏过程中,只允许出现两种状态之一。
(1)全部执行失败
(2)全部执行成功
事务执行过程中出现错误,会回滚到事务开始前的状态。事物是一个不可分割的整体。
2. 一致性(Consistency)
事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前后,数据库必须处于一致性状态。
例如:A、B两个账户总金额为1000,他们之间进行转账,不能因为A账户中扣除了钱,而B账户没有收到钱,他们之间无论转多少钱,多少次,总金额都是1000。
3. 隔离性(Isolation)
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间
一个事务内部的操作及使用的数据对其他并发事务是隔离的。并发执行的各个事务是不能互相干扰的。
4. 持久性(Duration)
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。所以在提交确认操作后使用回滚是无效的。
1.3 事务的并发问题
脏读:读到了没有提交的数据,事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据就是脏数据。
不可重复读:同一条命令返回不同的结果集。事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A在多次读取同一数据时,结果不一致。
幻读:重复查询的过程中,数据就发生了量的变化。事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。
1.4 事务的隔离级别
事务的隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(READ_UNCOMMITTED) | 允许 | 允许 | 允许 |
读已提交(READ_COMMITTED) | 禁止 | 允许 | 允许 |
可重复读(REPEATABLE_READ) | 禁止 | 禁止 | 可能会 |
顺序读(SERIALIZABLE) | 禁止 | 禁止 | 禁止 |
4种事务隔离级别从上到下,级别越高,并发性越差,安全性就越来越高,一般数据默认级别是读已提交(read_committed)或可重复读(repeatable_read)。
查看当前会话中事务的隔离级别:
select @@transaction_isolation
设置当前会话中事务的隔离级别:
set session transaction isolation level '级别';
例:设置为读未提交
set session transaction isolation level read uncommitted;
1. 读未提交(READ_UNCOMMITTED)
读未提交,该隔离级别允许脏读取,其隔离级别是最低的。如果一个事务正在处理理某一数据,并对其进⾏了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。
2. 读已提交(READ_COMMITTED)
读已提交是不同的事务执行的时候只能获取到已经提交的数据。 这样就不会出现上面的脏读的情况了。但是在同一个事务中执行同一个读取,结果不一致。
3. 可重复读(REPEATBLE_READ)
可重复读就是保证在事务处理理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别限制了不可重复读和脏读,但是有可能出现幻读的数据。
4. 顺序读(SERIALIZABLE)
顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执⾏行行,即事务只能一个接一个地处理,不能并发。