Spring事务中先写后读的行为表现是什么?
问题
假设存在一个标注了@Transactional注解的方法,该方法首先修改一个对象,随后读取该对象。请问读取到的对象是旧的未修改版本还是修改后的版本?这种情况是否属于脏读?
示例代码如下:
@Transactional public Item writeThenRead(Item something) { myDao.writeSomething(something); Item fetched = myDao.readThatThing(something.getId()); return fetched; }
回答
读取到的是修改后的版本
带有@Transactional注解的方法会开启一个数据库事务,同一个事务内的所有数据库操作都共享同一个数据库会话。数据库的事务隔离机制会保证当前事务内的修改对自身可见——简单说就是,你在事务里刚执行完更新操作,后续的查询会直接拿到这个还没提交的修改结果,不会是旧数据。这种情况不属于脏读
脏读的定义是一个事务读取到了另一个未提交事务的修改数据。而这里的读写操作都在同一个事务内部,完全是自身事务的操作,和脏读的场景不沾边。只有跨事务读取到其他未提交事务的修改时,才会构成脏读。
内容的提问来源于stack exchange,提问作者KJ0797
相关产品推荐
相关产品推荐

