MySQL-事务浅谈
事务是数据库中DML被执行时开启的一种数据保护机制,事务被用来完成系统的某一个功能,在执行DML语句时,数据库中的数据可能被改变时,数据库系统就会自动开启一个事务。
DML语句是数据库的INSERT、UPDATE、DELETE、SELECT等这些对数据库数据有实质性操作的语句,事务就是围绕DML语句而出现的。
事务最主要的功能是保证数据的安全性和一致性,在开启了事务的DML语句中,执行的时候要么全部成功,要么全部失败,在开始事务后执行DML,数据库会将标记数据标记在内存中,并不会马上将数据写入到硬盘中。
结束一个事务分为commit(提交)和rollback(回滚)。
- commit表示事务中所有DML语句均执行成功,数据成功成功写入硬盘,
- rollback表示事务中至少有一条没有成功执行,将会放弃这个之前所有执行过的DML语句的结果,硬盘中的真实数据不会改变。
事务四大特征(ACID)
- 原子性(A):事务是最小单位,不可再分
- 一致性(C):事务在所有的DML语句执行的时候,必须保证同时成功或者同时失败
- 隔离性(I):事务A和事务B之间具有隔离性
- 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
四大特征之一隔离性
事务之间互相具有一定的隔离性,通俗点说就是能否被互相访问。
隔离性有四种方式
- 读未提交:read uncommitted
- 读已提交:read committed
- 可重复读:repeatable read
- 串行化:serializable
- 读未提交
- 事务A和事务B,事务A在未提交之前就可以被事务B访问到。此时事务B访问到的是`脏数据`
- 事务B访问到的可能是事务A在rollback之前的数据,数据有一定的风险
- 一般的数据库隔离级别都高于`读未提交`
- 读已提交
- 事物A和事物B,事物A提交的数据,事物B才能读取到
- 这种隔离级别高于读未提交
- 这种级别可以避免“脏数据”
- 这种隔离级别会导致“不可重复读取”
- Oracle默认隔离级别
- 可重复读
- 事务A和事务B,事务A提交之后的数据,事务B读取不到
- 事务B是可重复读取数据
- 这种隔离级别高于读已提交
- 这种隔离级别可以避免“不可重复读取”,达到可重复读取
- 比如1点和2点读到数据是同一个
- MySQL默认级别
- 虽然可以达到可重复读取,但是会导致“幻像读”
- 此级别下的事务始终保持数据的一致性,幻像读的祸根
- 串行化
- 事务A和事务B,事务A在操作数据库时,事务B只能排队等待
- 这种隔离级别很少使用,吞吐量太低,用户体验差
- 这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发
注意
- 事务是数据库系统中最小的执行单元。
- 事务中包含的DML语句可以是1条或者很多条。
- 事务只和DML语句相关,没有DML语句就没有事务,但是DML可以选择不开启事务。