数据库隔离级别与常见问题
常见的事务问题
-
脏读
一个事务读取了另一个事务修改但未提交的数据,。
-
不可重复读
在同一事务中,同一个查询读取某行,在time1获取到某行,在time2重新读取时发现该数据发生修改,可能被更新或删除。
-
幻读
在同一事务中,同一个查询多次执行,由于其他插入操作的事务提交,导致返回不同结果集。
区别:
-
-
脏读与不可重复读
-
脏读:某事务读取另一事务未提交的脏数据。
不可重复读:同一事务内查询返回不同结果。
-
-
幻读与不可重复读
-
幻读:主要针对数据整体,insert操作。
不可重复读:主要针对同一数据项,delete或update操作。
事务四大特性(ACID)
-
原子性
事务中的操作不可再分割,这些操作要么全部成功,要么全部失败。
-
一致性
事务的执行不能破坏数据库的完整性和一致性,一个事务在执行前和执行后,数据库都必须处于一致性状态。
-
隔离性
并发操作时,不同事务之间互相隔离、互不干扰。
-
持久性
一旦事务提交,则事务中的数据操作需要被持久化到数据库中。
四种隔离级别(隔离强度从高到低,并发性能从低到高)
-
串行化(Serializable)
最高的隔离级别,强制事务排序,强制事务串行执行,使其不可能发生冲突。即在每个读的数据行加上共享锁。
可能导致大量的超时现象和锁竞争。
可防止脏读、不可重复读、幻读。
-
可重复读(Repeated Read)
确保同一个事务,在多次读取同样数据时,得到同样结果。
可防止脏读、不可重复读。
MySQL默认隔离级别为可重复读。
-
读已提交(Read Committed)
一个事务只能看见已提交事务所作的改变。
可防止脏读。
绝大多数数据库的默认隔离级别均为读已提交,例如Oracle、SQL Server、PostGre。
-
读未提交(Read Uncommitted)
所有事务都可以看到其他未提交事务的执行结果。
并发性能最高,但会产生脏读、不可重复读、幻读。
Spring的事务隔离级别
spring隔离级别就是数据库的四大隔离级别。spring默认隔离级别与数据库隔离级别一致。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY