• springboot数据源自动装配以及事务管理


    1.springboot项目中只是在yml文件中添加数据源的属性,并没有显示的配置当成组件注入到spring中,但是spring依旧能使用这个数据源,原因是boot对于数据源的自动装配,原理参考下面大神链接。

    https://blog.csdn.net/qq_28410283/article/details/86700635

    2.公司的老项目在mybatis调用存储过程的时候报只读错误 read-only:这是由于事物的传播特性中没有配置call属性,配上call属性并把只读设为false就可以了,注:我的存储过程涉及到了数据库的修改,所以不用函数,因为函数的调用是用select调用的,而一般的select只是查询作用不允许数据修改,所以不要把select 的只读属性改成false。

     3.在上述的事务配置中还有一个属性就是propagation,参考下边博文,这里用的是required,意思是如果没有事务就创建一个,有的话就用前边的,这样的话,如果是一个添加一个删除两条命令放在一起的话,因为我们配置的事务都是required所以两条命令就可以保证事务性,当抛出lang的异常时,就会回滚,这个属性也是默认的属性,xml文件配置和注解配置都是进行事务管理的办法。

    https://blog.csdn.net/weixin_39723544/article/details/91877478

    5.那spring怎么进行控制事务的呢?

    基于注解的话就不用说了,基于xml的事务控制其实也是运用了AOP,具体看一下配置:配置上明确说了,事务是控制在service层中的,所以,如果一个接口中有多个数据库操作的话,把他们都写在service层中,这样就可以实现事务管理了。

    6.在mysql中事务之间是怎样工作的呢?参考下边博文,因为事务之间具有隔离性,所谓的事务就是一个线程,在多线程中怎么保证数据安全呢?加锁,数据库也会对数据进行加锁,当一个事务修改数据时(假设这个事务有两条修改语句,加锁的时间是在第一条修改语句执行之后,然后这条数据被加了锁,这个事务不结束的话,另一个事务的修改语句就不能对这条记录进行操作)另一个事务就不能对数据进行修改,类似于cpu对线程的上下文切换。

    https://blog.csdn.net/weixin_39723544/article/details/98200870?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

    7.事务的隔离级别的理解:基于mysql不自动提交的情况(一般默认自动提交)

    我对事务的理解:一个事务就像回家的过程:开门-进门-关门  对应事务的开始-操作-提交/回滚 这样才是一个完整的事务。

    4个隔离级别:

    读未提交:修改一条数据后,这个事务还没有提交,但是可以被读到:也就是一个文件还没有盖章,没有盖章就是不确定,有两种选择:盖上章生效或者撕掉文件无效,但是这时候有的员工看到了,以为这个是老板的文件那肯定有效啊,但是文件的有效无效是不确定的,这个过程就是读未提交。

    读已提交:假如有一个事务正在执行两次查询操作,一条查询完后另一个事务要修改(update,不是insert)这条数据,查询的时候没加锁啊,所以改就改了,改了之后再查询这个数据的话发现两条一样的sql查询出来的东西不一样,这就是读已提交,但是不可重复读。

    可重复读:可重复读就是查询的事务(两条查询的sql语句)开启时,另一个修改的事务不能介入了(解决了update问题,但是带来了insert幻读的问题,也就是查询的事务之间insert是可以介入的),相当于加锁操作(加锁其实不太准确,因为只是确保一个事务两条查询的结果相同,但是对另一个事务的修改操作而言,它是已经修改成功数据的),带来的问题是幻读,但是mysql采用mvcc解决了幻读问题,幻读和不可重复读的区别是:幻读是插入数据的时候出现的,不可重复读是更新的时候出现的,所以一般来说就用这个隔离级别。

    串行:绝对的数据安全,读写操作都会锁住整张表,带来大量的锁竞争,消耗资源,不用这个。

    下图很好的解释了可重复读在mvcc下的概念我认为很重要的一个概念:不可见不等于不存在

     8.既然mvcc解决了问题,那为什么还有串行化这个 概念?

    因为有一种特殊情况:先查再改。因为查询不加锁(或者共享锁)因此事务A和B在查询的时候数据互通,但是接着事务B修改了一条数据,这时候对于这条数据进行加锁,事务A不能修改,只能等到事务B结束,然后事务A在修改,事务A修改是修改的什么呢?因为他之前执行了一次查询操作,又因为隔离级别是RR级别,所以数据更新就发生错误了,避免这种情况的方法就是直接修改最新的数据,去掉查询,这样在update的时候已经加锁,保证数据的安全。

    关于隔离级别的博文:

    https://blog.csdn.net/weixin_39723544/article/details/91653513

    关于mvcc参考下边博文:

    https://blog.csdn.net/weixin_39723544/article/details/98200870?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

    我不是程序员,我只是程序的搬运工
  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/keith0/p/12792878.html
Copyright © 2020-2023  润新知