Skip to content

事务个人简单理解

约 575 字大约 2 分钟

mysql

2019-05-23

事务特性

  • 原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
  • 持久性:事务执行完成后 数据一直保持
  • 隔离性:同一时间只能一个事务操作一个数据。(衍生出隔离级别)
  • 一致性:事务在完成后,数据库的数据确定不会再回滚等

事务自动提交属性 show variables like 'autocommit'

一致性由原子性、持久性、隔离性保证

原子性由 Undo Log 保证 Undo log:保存每次变更前的记录,用来恢复数据,回滚什么的

持久性由 Redo Log 保证 Redo Log:事务commit前,都会将记录保存到Redo log中,保存成功后才会允许commit,如果commit前断电之类不可抗力 可以通过redo log恢复

隔离性:

隔离性

select @@tx_isolation #查看隔离级别

set session transaction isolation level read uncommitted   # 修改隔离级别

事务隔离级别

  • Read Uncommitted(读取未提交内容):基本没啥用 什么都不能限制
  • Read Committed(读取提交内容):大部分数据库的默认级别,只能看到已提交的改变(避免脏读)
  • Repeatable Read(可重复读):mysql 的默认级别,同一事务并发时 保证读取数据行一样(避免脏读与重复读)
  • Serializable(串行化):最高级别 但是性能差,锁竞争(避免脏读、重复读、幻读)

脏读:读取到事务未提交的数据(A 读取到 B 未提交的数据,B 回滚,那么 A 的数据就是脏数据)

幻读:事务进行中读取到其他已提交的数据(A 更新后,B 操作数据库插入什么的,导致 A 发现仍有数据未更新)

不可重复读:事务进行时提交前后读取到的数据不一致(A 事务未提交时,其他数据先提交)

select @@tx_isolation; /*查询当前会话事务隔离级别*/
select @@global.tx_isolation;/*查询系统事务隔离级别*/

set session transaction isolatin level repeatable read; /*设置当前会话隔离级别*/
set global transaction isolation level repeatable read; /*设置系统隔离级别*/

  • .......