简介
事务(Transaction)是一组操作的集合,是不可分割的最小工作单位,事务中的操作要么全部成功、要么全部失败
基本操作
查看事务提交方式
0 为手动提交、1 为自动提交,MySQL 的事务默认是自动提交的,当执行一条 DML 语句后,MySQL 会隐式的提交事务
select @@autocommit
设置事务提交方式
set @@autocommit = 0/1
提交事务
commit
回滚事务
当执行事务发生异常时,不进行 commit 而是 rollback ,即可完成事务回滚
rollback
开启事务
start transaction 或 begin
四大特性(ACID)
原子性(Atomicity)
事务是不可分割的最小工作单元,事务中的所有操作,要么全部成功,要么全部失败,原子性基于日志的 Redo/Undo 机制
一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态,如转账事务中,用户A和用户B之间转账,事务前后二者的余额总量应不变
隔离性(Isolation)
当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
持久性(Durability)
事务一旦被提交,对数据库中数据的改变是永久性的(持久化在磁盘文件中),即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
并发问题
脏读
事务A读取到事务B更新了但未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据
不可重复读
在数据库访问时,一个事务先后读取同一条记录却读到了不同的数据内容
若事务A的执行周期较长,事务A在第一次读取某个数据时,此数据的值为100,读取完成后,事务A又去执行其他的事情,在这个过程中,事务B将这个数据的值修改为200,然后事务A做完其他的事情后,又来读取这个数据的值,发现这个值和第一次所读取的值不相同,这种现象称为不可重复读
幻读
事务A在查询完某一记录后,事务B对该记录执行了增加或删除操作,之后事务A再次查询同一记录,发现两次查询的结果不一致,这种现象称为幻读
幻读造成两次读取的记录数量不同,而不可重复读造成的是两次读取同一记录,但数据不同
幻读侧重的是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作,更具体的说,事务A去 select 某记录是否存在,结果为不存在,准备插入此记录,此时事务B对该记录执行了 insert 操作,事务A执行 insert 时发现此记录已存在,无法插入,发生幻读
隔离级别
从上到下,隔离级别越来越高,隔离级别越高,数据越安全,性能越低
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(Read Uncommitted) | √ | √ | √ |
读已提交(Read Committed) | × | √ | √ |
可重复读(Repeatable Read) | × | × | √ |
串行化(Serializable) | × | × | × |
查看事务隔离级别
select @@tx_isolation (5.0 以上版本)
select @@transaction_isolation (8.0 以上版本)
设置事务隔离级别
session 表示只在当前会话(连接)有效
global 表示之后获取的会话(连接)有效
set [session | global] transaction isolation level 隔离级别