事务(transaction)指的是一组不可分割的数据库操作序列,这些操作要么全部执行成功,要么全部不执行,是一个整体,不可再分。事务的执行结果必须使数据库从一个一致性状态转换到另一个一致性状态。
启动事务:
start transaction/begin;
提交/放弃:(停止事务状态)
rollback;
commit;
回滚到指定位置:
savepoint svpt1;
rollback to svpt1;
一、ACID特性
事务的目标:C:一致性(Atomicity)
数据库从一个一致的状态转移到另一个一致的状态。所有数据都是已完成的事务提交后的结果。
1、A:原子性(Atomicity)
- 事务是数据库的逻辑工作单位,事务中包含的各个操作要么全部成功(commit),要么全部失败(rollback)。
2、I:隔离性(Isolation)
- 事务的执行不会被其他事务干扰。
- 事务之间相互隔离,一个事务不应该看到其他事务的中间状态。
- 隔离性有不同的级别,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
3、D:持久化性(Durability)
- 一旦事务提交(Commit),则其所做的修改会永久保存在数据库中。
- 即使系统发生故障,事务执行的结果也不会丢失。
二、并发问题
按照严重程度降序排列叙述:
1、脏写(不可接受)
一个事务修改另一个事物为提交的数据。
两个事务同时修改一行数据,会出现后一个事务覆盖前一个事务修改的数据,导致数据出错。
解决方法: 不允许写入同一行(加锁)
2、脏读
一个事务执行中读取另一个事务未提交的数据。
解决方法:只允许读已经commit的行
3、不可重复读
一个事物先后读取同一行,数据不一致(一个是上一次commit的数据,一次是这次commit的数据)。
解决方法:把曾经读过的数据备份/加锁
4、幻读
一个事物先后读取表的整体信息,数据不一致。
解决方法:把整个表哦备份/加锁
三、隔离级别
查看隔离级别:
select @@transaction_isolation;
默认为可重复读级别:
修改当前会话的隔离级别:
set session transaction isolation level read uncommitted;
set session transaction isolation level+要修改的隔离级别;
按照隔离强度升序排列叙述:
1、读未提交
解决的问题:脏写
未解决的问题:脏读
2、读已提交
解决的问题:脏读
未解决的问题:不可重复读
3、可重复读
解决的问题:不可重复读
未解决的问题:幻读
Mysql的InnoDB引擎部分优化了幻读(备份)
MVCC机制:
Multi-Version Concurrency Control,多版本并发控制,当对全表进行select操作时,新建一个指向表的指针,并且记录表的变化,在再进行select操作时通过指针还原表,然后返回结果。
4、序列化
并发全部问题均已解决
缺点:使用锁机制,性能极差