简介 目录 评价 推荐
  • 阿科你好 2022-05-17
    如果是事务2先修改数据

    执行一下看看呢

    1回答·280浏览
  • 慕哥9020169 2021-12-14
    1111111111

    是的,没错

    1回答·239浏览
  • 慕哥9020169 2021-12-14
    1111111111
    0回答·247浏览
  • 慕斯卡4101522 2021-08-11
    有没有课堂代码

    这个要自己动手,这样学习更好,真的

    1回答·401浏览
  • 透明的我 2020-11-22
    一级缓存读取的数据不对??

    首先一级缓存必须是同一个session,你的session2提交并不会对session1的缓存进行update,而且这种事应该编码时避免的错误,session在使用完后及时关闭。这个session缓存和数据库事务应该是没什么关系的。个人理解,如有偏差欢迎指正。

    2回答·563浏览
  • weixin_慕哥6120633 2020-09-16
    一级缓存是否真的有意义

    分页不是吗

    1回答·569浏览
  • 慕仔3163040 2020-09-01
    session2做了commit提交,不是会清空所有缓存吗?为什么session还能查询到18岁?

    session的生命周期在事务内,也就是说,事务1和事务2分别有对应的session1和session2。一级缓存的作用域在同一session内,所以事务2提交只会清空session2的缓存,对session1没有影响。

    2回答·570浏览
  • qq_慕雪4472241 2020-08-28
    判断false

    可以看一下事务注解是否生效,或者打断点读取一下SQLsession中的一级缓存是否真的没有

    1回答·606浏览
  • printf_渣渣 2020-08-26
    不可重复读问题
    2回答·605浏览
  • 定义域 2020-08-23
    在企业生产中每一步操作都会有切面日志insert一条日志记录,这样是不是意味着一级缓存永远没起作用?

    在insert之前,如果在一个sqlsession中做了重复的业务查询操作,那么一级缓存是可能命中的,否则的话,的确是永远没有起作用。

    2回答·528浏览
  • 慕数据9373414 2020-08-11
    还是没明白为什么要关掉sqlsession

    二级缓存中:一个SqlSession产生的二级缓存必须在关闭或者提交的时候才有效。因为只有关闭后,才知道你没有做更新等操作,产生的二级缓存才不会被销毁。这就跟事务是一样的,一个事务提交之后,其他的事务才能获取到 前面事务修改的数据。

    2回答·990浏览
  • 来一串烤bug 2020-07-28
    所有的service都能开事务吗?每个service都开事务会有什么缺点吗?

    都可以开,这个没什么缺点

    1回答·791浏览
  • 寻找遗失的角落 2020-07-22
    关于脏读的问题

    感觉 没有什么好的方法 只有清空Redis缓存

    1回答·560浏览
  • 孙悟空空空空 2020-06-26
    二级缓存脏读问题

    我感觉没必要究竟于这个字眼, 脏读 在MySql 里面的表现 是 读到事物未提交的数据,改数据可能会发生回滚,所以叫脏读,数据库事物隔离级别  读未提交 是用来解决这个问题的。而这边老师 说的  脏读   是不同的SqlSessionFactory下的问题,这边你所说的 没法读到最新数据的问题,可以理解为脏读的呀,因为缓存来源是从数据库里面读然后缓存下来的,如果SqlSessionFactoryA 里面对数据做了更新, 这个时候SqlSessionFactoryB 里面的可能还是旧的数据,也可以称之为脏数据,感觉没问题哈~ 上面都是我自己的理解 ,仅供参考! 所以说MBatis 里面 说有脏读的问题  都是这个意思,不管是说同一个SqlSession下的一级缓存问题,还是这个!感觉最终的表述就是没有读取到最新的数据,那读到就是脏数据,这么去理解 也是没问题的!

    1回答·786浏览
  • 慕容5263072 2020-06-14
    二级缓存的过程


    Mybatis Cache

    一级缓存特点

    1. 自动启用

    • 通过在setting中设置localCacheScope= STATEMENT(默认为SESSION)全局禁用一级缓存

    • 在Dao接口方法上添加注解:@Options(flushCache=Options.FlushCachePolicy.True),禁用这个方法的一级缓存

    命中原则,同一SqlSession内,以下5个条件组成key,放入缓存中:

    • 条件一:statementId相同

    • 条件二:sql上用到的参数要一样

    • 条件三:分页参数要一样 

    • 条件四:sql语句的文本要一样

    • 条件五:数据库连接的environment要一样

    生命周期

    • 产生:sqlSession执行查询方法,而不是update等

    • 销毁:sqlSession关闭、sqlSession提交、sqlSession回滚、sqlSession执行update(新增、删除、更新)后底层会执行清除、主动清除

    • 辟谣:Mybatis 一级缓存脏读(数据被另外事务修改并提交后,仍会从缓存中读到旧数据(错误),实际是避免了事务不可重复读问题), Mybatis 一级缓存是在事务的生命周期之内的,在关闭session、执行commit、执行rollback都会清空Mybatis一级缓存。 实际上Mybatis 一级缓存反而避免了数据库事务中的脏读(读未提交)、不可重复读(读提交)问题。

    源码解读

    • 代理模式与装饰模式的区别:代理模式在无参构造方法中确定地new了一个被代理的对象,编译时已经可以确定;而装饰模式是通过有参构造方法将被装饰对象传入装饰 类中,能够在运行时递归地被构造。

    设计理念:在一个session内,不过期、不更新、不限制;

    与spring整合时,如果开启了事务,事务内,Spring通过ThreadLocal始终使用同一个sqlSession,一级缓存生效; 如果没有开启事务,每次查询前会创建一个sqlSession,查询结束后会关闭sqlSession,所以一级缓存无效; 

    二级缓存特点(跨sqlSession、有脏读问题,建议直接不用)

    1. 启用步骤:

    • 在mybatis.xml中settings标签下添加; 

    • 在mapper.xml中mapper标签下添加:属性eviction(LRU( 默认)、FIFO、SOFT、WEAK)和size(实例数,默认不限制),通过这两个属性可自定义二级缓存的清除策略

    • 在mapper.xml中mapper标签下添加:属性type,通过设置type可以指定使用的Cache对象,后面自定义缓存中有用到

    • 默认地,select标签flushCache="false" useCache="true",其他标签flushCache="true" entity类实现Serializable标记类; 

    命中原则,同一SqlSessionFactory内,以下5个条件组成key,放入缓存中: 

    • 条件一:statementId相同 

    • 条件二:sql上用到的参数要一样 

    • 条件三:分页参数要一样 

    • 条件四:sql语句的文本要一样 

    • 条件五:数据库连接的environment一样 

    生命周期 

    • sqlSession关闭-创建二级缓存、 

    • sqlSession提交-创建二级缓存、

    • sqlSession回滚、

    • sqlSession执行update(新增、删除、更新)、销毁二级缓存唯方法:同一mapper.xml执行update(新增、删除、更新)注意:同一个表的操作要放在同一个mapper下

    • sqlSession主动清除

    • 产生:1.能产生一级缓存;2.对sqlSession进行关闭或提交; 

    • 销毁:

    源码解读 (MapperBuilderAssistant.class->useNewCache、XMLMapperBuilder.class->cacheElement)

    • 缓存是存在Configuration下并且缓存使用的是PerpetualCache(非分布式),而Configuration又是在DefaultSqlSessionFactory下,所以不同的SqlSessionFactory下的缓存是相互隔离的;

    • 通过自定义Redis缓存(实现Cache),将mapper下的cache指定type为自定义的类,就可以实现缓跨DefaultSqlSessionFactory;


    4回答·541浏览
  • 落0o0羽 2020-06-07
    与spring 集成

    现实中不会把这么多功能放在一个事务中吧。。。

    1回答·490浏览
  • 落0o0羽 2020-06-07
    mybatis疑惑

    你想让它炸它肯定能炸,哈哈哈哈,何必为难人家,让它做力所能及的事不好吗

    1回答·471浏览
  • koosee 2020-06-02
    课程的源码可以分享下吗?
    0回答·368浏览
  • 草鱼禾 2020-05-21
    一级缓存和二级缓存,对象不相等?

    二级缓存默认是可读写的,在可读写的情况下会用序列化缓存SerializedCache来装饰,在存入和获取的时候会对数据对象进行序列化和反序列化,返回的是一个新的对象。所以使用二级缓存的实体类必须实现序列化接口


    2回答·777浏览
  • 草鱼禾 2020-05-15
    课程里面的源码在哪里下载呢?

    我看了视频,顺便练习了代码。
    https://gitee.com/Yenn-2017_admin/mybatis_cache_details

    3回答·569浏览
  • qq_zHv_0 2020-05-15
    多个sqlseesion会不会出现?脏读

    一级缓存 是sqlsession 级别的,所以多个sqlsession 不存在上面说的脏读的问题。就算是分布式的环境下,就像视频中的说的 SqleSession是开启数据库事务的,这个就要结合数据库 默认的事物级别有关系了  正常MySql 默认的是可重复读,然后利用MVCC和数据库的锁 去解决了 幻读的问题!

    5回答·847浏览
  • allen平凡之路 2020-05-13
    mybatis 就是默认开启一级缓存的是吧
    已采纳 qq_慕神0568869 的回答

    一级缓存是不能关闭的,但可以设置flushCache=true强制清除缓存或更改localCacheScope=STATEMENT,这样每次都会查数据库,当然也可以手动调用session.clearCache清除

    3回答·3046浏览
  • 慕移动2525875 2020-05-13
    老师能分享课件吗

    可以截图,或者自己记笔记

    1回答·512浏览
  • HyZhan 2020-05-12
    课程的顺序
    我和平台反馈下~


    4回答·593浏览
数据加载中...
开始学习 免费