数据库事务的四个主要特征和隔离级别
1.简介
1.1.事务是什么
事务(Transaction)是由一条或多条操作数据库的 SQL 语句组成的一个不可分割的工作单元,这些操作要么都完成,要么都回滚。一个事务往往对应一个完整的业务。
1.2.事务关键流程
2.事务四大特性(ACID)
2.1.原子性(atomicity)
事务是个完整体,不可再分(就像化学中的原子不可再分),要求所有DML语句操作必须同时成功或同时失败。
2.2.一致性(consistency)
事务前后的数据要保持一致。 如:A有10元钱,B有20元钱。B转10元给A,完成转账后A+B的钱还是30元。
2.3.隔离性( isolation )
不同的事务之间互相隔离。
2.4.持久性(durability)
事务结束后,内存数据持久化的磁盘中。
3.并发问题
3.1.两种数据丢失
第一种是指两个事务同时操作同一个数据时,当第一个事务回滚时,把已经提交的第二个事务的更新数据覆盖了,第二个事务就造成了数据丢失。
问题关键点:不同事务可以「同时修改同一条」数据。
第二种是指当两个事务同时操作同一个数据时,第一个事务将修改结果成功提交后,对第二个事务已经提交的修改结果进行了覆盖,对第二个事务造成了数据丢失。
问题关键点:不同事务同时读了同一条数据,「某个事务修改后提交事务了」,但其他事务「并没有读最新的数据」就修改提交数据,相当于前一个事务的修改结果无效,导致数据丢失。
3.2.脏读
脏读是指一个事务读取了另一个未提交事务的数据。
如:事务A读取了事务B未提交的数据,假如事务B未正确执行,回滚,则事务A读取到的就是脏数据。
问题关键点:读了「未提交」事务的数据。
3.3.不可重复读
不可重复读是指一个事务对同一行数据重复读取两次,但得到的结果内容不同。
如:一个事务执行过程中,另一事务提交并修改了当前事务正在读取的数据
问题关键点:同一个事务多次「读条件相同」的数据,其他事务还可以「修改该条件下」的数据。
3.4.幻读
幻读是同一个事务的相同的两次查询的结果数不一致。
如:一个事务执行过程中,另一个事务新增或删除了数据,导致两次相同的查询结果条数不同。
问题关键点:同一个事务多次「读条件相同的数据」,其他事务还可以「新增或删除该条件下」的数据。
❝解决问题????
❞
4.隔离级别
事务分为两种:读事务和写事务。
4.1.读未提交(Read UnCommitted)
多个事务能同时读未提交的数据 一个事务读的时候其他事务还可以写 一个事务写的时候其他事务还可以读 但不能同时写
解决的问题:可防止丢失更新
4.2.读已提交(Read Committed)
多个事务能同时读已提交的数据 一个事务读的时候其他事务还可以写 一个事务写的时候其他事务禁止所有操作 但不能同时写
解决的问题:可有效防止脏读。
4.3.可重复读(Repeatable Read)
多个事务能同时读已提交的插入数据,不能读已提交的修改数据 一个事务读的时候其他事务只能读禁止写 一个事务写的时候其他事务禁止所有操作 但不能同时写
解决的问题:可有效防止不可重复读和脏读(InnoDB存储引擎还解决了幻读问题)。
4.4.串行化(Serializable)
事务只能一个接着一个地执行,不能并发执行。
解决的问题:可有效防止脏读、不可重复读和幻读。
但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。
5.事务的一些常用操作
5.1.设置事务自动提交
--查看当前会话
show session variables like 'autocommit';
--查看全局会话
show global variables like 'autocommit';
--设置当前会话
set session autocommit = 0|1|ON|OFF;
--设置全局会话
set global autocommit = 0|1|ON|OFF;
--查看当前会话
show session variables like 'autocommit';
--查看全局会话
show global variables like 'autocommit';
--设置当前会话
set session autocommit = 0|1|ON|OFF;
--设置全局会话
set global autocommit = 0|1|ON|OFF;
选项:0|1|ON|OFF
关闭:0 和 OFF 开启:1 和 ON
5.2.设置隔离级别
--查看当前会话
select @@tx_isolation;
select @@session.tx_isolation;
--查看全局会话
select @@global.tx_isolation;
show global variables like 'tx_isolation';
--设置当前会话
set tx_isolation='隔离级别';
--设置全局会话
set global transaction isolation level 隔离级别;
隔离级别
read uncommitted read committed repeatable read serializable
6.总结
一般来说,事务的隔离级别越高,越能保证数据库的完整性和一致性,但相对来说,隔离级别越高,对并发性能的影响也越大。官方默认使用「可重复读(Repeatable Read)」 但也可以将数据库的隔离级别设置为读已提交(Read Committed),即能防止脏读,又能有较好的并发性能,关于不可重复读、幻读和第二类数据丢失这些并发问题,可通过在应用程序中采用悲观锁和乐观锁加以控制。
关注阅读更多优质文章???? 获取思维导图????公众号输入:dt0010
推荐阅读
-
数据库架构:在三分钟内了解事务隔离级别和脏读取
-
什么是事务?事务的四个特征(ACID)?并发事务会带来哪些问题?什么是事务隔离级别?事务的传播特性
-
什么是数据库事物?为什么需要数据库事物,事物有哪些特征?事物的隔离级别是什么?-1.什么是数据库事务? 1.事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须具备四个属性,即ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为事务: 原子性 2.事务必须是一个原子工作单元;它的数据修改要么全部执行,要么全部不执行。 一致性 3.事务完成时,所有数据必须保持一致。在相关数据库中,所有规则都必须适用于事务的修改,以保持所有数据的完整性。事务结束时,所有内部数据结构(如 B 树索引或双向链接表)必须正确无误。 隔离 4.并发事务的修改必须与其他并发事务的修改隔离。一个事务会在另一个并发事务修改之前或之后查看某一状态下的数据,而不会查看中间状态下的数据。这就是所谓的可序列化,因为它允许重新加载起始数据和重放一系列事务,从而使数据最终处于与原始事务执行时相同的状态。 持久性 5.事务完成后,它对系统的影响是永久性的。即使在系统发生故障的情况下,修改也会保留。 2. 为什么需要数据库事物,事物有哪些特征? 事物对数据库的作用是对数据进行一系列操作,要么全部成功,要么全部失败,防止出现中间状态,确保数据库中的数据始终处于正确、和谐的状态。 特征:原子性、一致性、隔离性、持久性,以及其他特征 原子性(Atomicity):所有操作在事务开始后,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出现错误时,会回滚到事务开始前的状态,所有操作就像没有发生一样。也就是说,事务是一个不可分割的整体,就像化学中的原子一样,是物质的基本单位。 一致性(Consistency):在事务开始之前和结束之后,数据库的完整性约束都没有被破坏。例如,如果 A 转钱给 B,A 不可能扣除这笔钱,但 B 却没有收到这笔钱。 隔离:在同一时间内,只允许一个事务请求相同的数据,不同事务之间没有干扰。例如,甲正在从一张银行卡上取款,在甲取款过程结束之前,乙不能向这张卡转账。 持久性(耐用性):事务完成后,事务对数据库的所有更新都将保存到数据库中,无法回滚 3.事务的隔离级别有哪些? 数据库事务有四种隔离级别,从低到高分别是未提交读取(Read uncommitted)、已提交读取(Read committed)、可重复读取(Repeatable read)、可序列化(Serializable)。此外,事务的并发操作中可能会出现脏读、不可重复读、幽灵读等情况。事务并发问题 脏读:事务 A 读取事务 B 更新的数据,然后事务 B 回滚操作,那么事务 A 读取的数据就是脏数据。 不可重复读取:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取期间更新并提交数据,导致事务 A 多次读取同一数据时结果不一致。 幻影读取:系统管理员 A 将数据库中所有学生的具体分数改为 ABCDE 等级,但系统管理员 B 在此时插入了具体分数的记录,当系统管理员 A 更改结束后发现仍有一条记录未被更改,仿佛发生了幻觉,这称为幻影读取。 小结:不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于增删。解决不可重复读问题只需锁定满足条件的行,解决幻读问题则需要锁定表 MySQL 事务隔离级别
-
数据库事务和事务隔离级别的四个主要特征
-
数据库事务和事务隔离级别的四个主要特征
-
数据库事务的四个主要特征(ACID)和事务的隔离级别
-
关于事务的四个特征、事务的隔离级别、事务的并发性
-
了解事务(Transaction)的四个特性--原子性、一致性、隔离性和持久性(ACID)
-
数据库事务的四个主要特征和隔离级别
-
透彻解读 MySQL 事务的四个隔离级别