发布时间:2024-03-29 18:01
学习之前要先了解,什么叫脏读、幻读和不可重复读
读未提交(read uncommit)(ru)
也就是说在一个事务还没有提交的时候,别的事务有可能读到这个未提交事务的数据
比如事务1 将A的存款从700改成1000,事务1还没有提交的时候事务2读取到了事务1提交的1000,但是事务1发生了错误进行回滚,导致A的存款还是700,但是事务2认为A的存款是1000,就产生了脏读
读已提交(read commit)(rc)
也就是说一个事务提交以后才有可能被其他事物读到
比如程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。
这时候就出现了不可重复读的情况,oracle就是用的这种情况
可重复读(repeatable read)(rr)
就是在开始读取数据时,不再允许修改操作
程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。
但是会出现幻读问题
也就是程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。
这个地方个人理解是,程序员买单的事务,可以拆分为查询余额,扣除余额之前查询余额,扣除余额,这里是进行更新操作,别的事务在这个时候不能进行修改,但是在进行查询记录的时候,因为过程时查询,打印之前在查询,只有select,没有update,所以会程序员消费相当于增加一条记录,就会产生幻读
序列化(serializable)
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
参考文章
事务的四种隔离级别_逐梦追风_博客-CSDN博客
广东开放大学形考任务Java程序设计基础(专,2022春)第1章单元测验答案
sqlserver 由于文件不可访问_我们学院的小鲜肉教你“SQL Server配置文件到提权”...
Android 开发中 Kotlin 会取代 Java 吗?
appuim java 脚本_APP自动化测试神器之Appium-QQ登录脚本实战(java版)
react项目http-proxy-middleware跨域问题
SpringBoot接口 - API接口有哪些不安全的因素?如何对接口进行签名?
yolov5 ModuleNotFoundError: No module named ‘models‘