plt305 2023-03-09 05:51 采纳率: 100%
浏览 83
已结题

spingboot的读提交事务不生效


CREATE TABLE `users` (
  `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `sex` varchar(2) NOT NULL,
  `AGE` int(11) NOT NULL,
  `email` varchar(32) NOT NULL,
  `password` varchar(40) NOT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_unique` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


INSERT INTO `dba6`.`users`(`name`, `sex`, `AGE`, `email`, `password`, `id`) VALUES ('张三', '男', 11, '111@163.con', '112233', 1);
import com.example.mybatis_plus.entity.UsersEntity;
import com.example.mybatis_plus.mapper.UsersDao;
import com.example.mybatis_plus.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;


@Service("usersService")

public class UsersServiceImpl  implements UsersService {

    @Autowired
    private UsersDao usersDao;

    @Override
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
    public void updateUser() throws InterruptedException {

            System.out.println("开始执行了");
            UsersEntity usersEntity=usersDao.selectById(1);

            usersEntity.setName("李四");
            usersDao.updateById(usersEntity);

            Thread.sleep(20*000);


    }

    @Override
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
    public void getUser() throws InterruptedException {
        UsersEntity usersEntity = usersDao.selectById(1);
        System.out.println(usersEntity);

        Thread.sleep(60*1000);
        usersEntity = usersDao.selectById(1);
        System.out.println(usersEntity);
    }
}
  1. 我先执行updateUser,再执行getUser。
  2. 两者事务,都是读提交。
  3. getUser第一次执行时,输出的name为张三
  4. 但getUser第二次执行时,updateUser已经更新(20秒),而事务是读提交的,此时getUser在60秒后读取,应该是李四,但结果依旧为张三??把事务替换为可重复读,也是这个效果
UsersEntity(name=张三, sex=男, age=11, email=111@163.con, password=112233, id=1)
开始执行了
UsersEntity(name=张三, sex=男, age=11, email=111@163.con, password=112233, id=1)
  • 写回答

6条回答 默认 最新

  • qq_37749055 2023-03-09 09:09
    关注

    缓存问题,数据库应该已经改成李四了
    一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月17日
  • 已采纳回答 3月9日
  • 创建了问题 3月9日

悬赏问题

  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM