6

MySQL-事务浅谈

 2 years ago
source link: https://blog.dugulingping.com/sql/transaction-little.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

事务是数据库中DML被执行时开启的一种数据保护机制,事务被用来完成系统的某一个功能,在执行DML语句时,数据库中的数据可能被改变时,数据库系统就会自动开启一个事务。

DML语句是数据库的INSERT、UPDATE、DELETE、SELECT等这些对数据库数据有实质性操作的语句,事务就是围绕DML语句而出现的。

事务最主要的功能是保证数据的安全性和一致性,在开启了事务的DML语句中,执行的时候要么全部成功,要么全部失败,在开始事务后执行DML,数据库会将标记数据标记在内存中,并不会马上将数据写入到硬盘中。

结束一个事务分为commit(提交)和rollback(回滚)。

  • commit表示事务中所有DML语句均执行成功,数据成功成功写入硬盘,
  • rollback表示事务中至少有一条没有成功执行,将会放弃这个之前所有执行过的DML语句的结果,硬盘中的真实数据不会改变。

事务四大特征(ACID)

  • 原子性(A):事务是最小单位,不可再分
  • 一致性(C):事务在所有的DML语句执行的时候,必须保证同时成功或者同时失败
  • 隔离性(I):事务A和事务B之间具有隔离性
  • 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)

四大特征之一隔离性

事务之间互相具有一定的隔离性,通俗点说就是能否被互相访问。

隔离性有四种方式

  1. 读未提交:read uncommitted
  2. 读已提交:read committed
  3. 可重复读:repeatable read
  4. 串行化: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串行,而不并发
  1. 事务是数据库系统中最小的执行单元。
  2. 事务中包含的DML语句可以是1条或者很多条。
  3. 事务只和DML语句相关,没有DML语句就没有事务,但是DML可以选择不开启事务。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK