MYSQL 事物

前言

这篇文章主要是讲解 MYSQL 事物相关知识。

什么是 MYSQL ?

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

什么是 MYSQL 事物?

数据库事物是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

事务最经典也经常被拿出来说例子就是转账了。

例如:小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

什么是隔离级别 ?

由并发事务所作的修改必须与任何其它并发事务所作的修改隔离,互相不受影响。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。mysql具有四种事物隔离级别,隔离力度依次递增,高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。不同业务场景下使用不同的数据库事物隔离性,部分关键业务采用隔离性高的隔离级别,以保证数据正确性。

事物的四大特性 ACID

  1. 原子性

事物作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

  1. 一致性

一致性有两层语义,一层是确保事务执行结束后,数据库从一个一致状态转变为另一个一致状态。另一层语义是事务执行过程中的中间状态不能被观察到。

如果数据库中有没有执行完的事务,那就是不一致的,否则,就是一致的。即事务必须被执行完。

  1. 隔离性

并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

  1. 持久性

已被提交的事物对数据库的修改应该永久保存在数据库中。

并发事物带来哪些问题?

多个事物并发执行时,经常会操作相同的数据完成各种的任务,并发虽然是必须的,但会存在以下的问题。

  1. 脏读

当一个事物正在访问数据并且对数据进行了修改,而这种修改还未提交到数据库中,这时候如果另一个事物也访问了这个数据,然后使用了这个数据,因为这个数据在第一个事物中还未提交,那么另外一个事物读取到的这个数据是"脏数据",依据"脏数据"所做的操作可能是不正确的

  1. 丢失修改

指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。

  1. 不可重复读

指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

  1. 幻读

幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

事务隔离级别有哪些?

  1. Read Uncommitted 读取未提交

事物能读到不同事物没有提交(未commit)的数据结果,实际应用比较少,会产生脏读,事物已经读到其他事物未提交的数据,但数据被回滚,称为脏读。

  1. Read Committed 读取已提交

事物读取其他事物已经提交的数据,读取到的是最新的数据,所以会出现在同一事物中select读取到的数据前后不一致,会出现不可重复读问题,不可重复读问题就是我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。

  1. Repeatable Read 可重复读

mysql 默认事物隔离级别,在同一事物中多次读取同样的数据结果是一样的,解决了不可重复读的问题,此级别会出现幻读的问题,幻读:当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。

  1. Serializable 可串行化

最高的事物隔离级别,串行化强制事物排序阻塞,避免事物冲突,解决了上述所有的问题,它使用了共享锁,执行效率低下,会导致大量的超时和锁切换竞争现象,实际开发应用很少。

MySQL 的默认隔离级别是?

MySQL InnoDB存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重读)。
InnoDB 存储引擎在分布式事务的情况下一般会用到 SERIALIZABLE(可串行化) 隔离级别。

运行命令查看到MySQL隔离级别

   #  查看到 MySQL 隔离级别
     select @@tx_isolation;
   #  设置 MySQL 隔离级别
     set session transaction isolation level read committed;

你可能感兴趣的:(MYSQL 事物)