事务及设置MySQL隔离等级 学习笔记
什么是事务?
指访问并可能更新数据库中各项数据项的一个程序执行单元。
事务的四个特性
原子性:事务所包含的所有操作,要么全部执行,要么全部不执行,不能停滞在中间环节。事务在执行过程中出错,会回滚到事务开始前的状态,即事务是一个不可分割的整体。
一致性:事务在开始和结束时,应满足一致性约束。如将订单行写到了磁盘上,却没有写入相应的订单明细,则订单与订单明细之间的一致性就被破坏了;操作之前和操作之后总量是不变的,理解:A和B都有100元,A给B了100元,A和B的钱数总和还是200元。
隔离性:指多个事务并发访问时,事务之间是隔离的,,一个事务不应该影响其他事务运行,即多个并发事务之间要相互隔离
持久性:对数据库所做的更改需持久的保存在数据库中,不会被回滚。即事务完成之后,结果能持久维持下去,不管断电还是其他情况。
脏读,不可重复读,幻读
脏读:读取到另一个事务回滚前的脏数据。即事务B对数据进行修改,事务读取了修改之后的数据,B又对此数据进行了回滚,此时A读到的数据就叫脏数据。
不可重复读:事务A读取数据后,事务B对此数据进行更改,当A再进行读取时,发现数据改变了。
幻读:在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
不可重复读针对的是update或delete,幻读针对的是insert。
事务隔离级别
Read uncommitted (读未提交)
Read Committed (读已提交)
Repeatable Reads (可重复读)
Serializable (串行化)
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted (读未提交) | √ | √ | √ |
Read Committed (读已提交) | ✘ | √ | √ |
Repeatable Reads (可重复读) | ✘ | ✘ | √ |
Serializable (串行化) | ✘ | ✘ | ✘ |
隔离级别越高执行效率越低。
MySQL支持以上四种隔离级别,默认隔离级别为Repeatable Reads (可重复读)。
Oracle 只支持Serializable (串行化)和Read Committed (读已提交),默认隔离级别为Read Committed (读已提交)。
设置MysQL的事务隔离级别
– 查看当前事物级别:
SELECT @@tx_isolation;
– 设置事务隔离级别
set session transaction isolation level ;
global:设置全局的事务隔离级别;
session:设置当前session的事务隔离级别,如果语句没有指定global或session,默认值为session;
– 设置read uncommitted级别:
set session transaction isolation level read uncommitted;
– 设置read committed级别:
set session transaction isolation level read committed;
– 设置repeatable read级别:
set session transaction isolation level repeatable read;
– 设置serializable级别:
set session transaction isolation level serializable;