MySQL 学习笔记——事务(Transaction)

简介

事务(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 隔离级别

你可能感兴趣的:(MySQL,mysql,数据库,事务)