zoukankan      html  css  js  c++  java
  • 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

    我不是程序员,我只是程序的搬运工
  • 相关阅读:
    poj2492A Bug's Life
    poj2912Rochambeau
    poj1062昂贵的聘礼
    poj3169Layout(差分约束)
    poj2240Arbitrage
    poj1502MPI Maelstrom
    poj3259Wormholes
    1/8=1/a+1/b,a,b为自然数
    目录查找
    待删除未删除 问题解决
  • 原文地址:https://www.cnblogs.com/keith0/p/12792878.html
Copyright © 2011-2022 走看看