栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据库事务的四大特性和隔离级别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据库事务的四大特性和隔离级别

更好阅读体验:数据库事务的四大特性和隔离级别

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;

选项: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


一键三连

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/694980.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号