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日

悬赏问题

  • ¥15 快手联盟怎么快速的跑出建立模型
  • ¥15 关于腾讯云服务器中,PHP页面无法打开的问题
  • ¥60 如何把照片修复成原始拍摄图
  • ¥80 Exited too quickly (process log may have details)
  • ¥15 爬知乎登录之后内容加载不出来
  • ¥15 怎么用protues测量通频带
  • ¥15 zepelin使用sparkInterpreter 异常
  • ¥15 paho mqtt 接收不到消息
  • ¥15 函数r关于两个分量y,z方向上的图像,分开画r随y的图像,r随z的图像
  • ¥15 如何用Matlab求Pearcey函数的数值积分?