Spring学习JdbcTemplate数据库事务参数

2023年 8月 13日 60.3k 0

目录
  • spring JdbcTemplate数据库事务参数
    • 一、propagation
      • 1. REQUIRED
      • 2. REQUIRES_NEW
      • 3. SUPPORTS
      • 4. NOT_SUPPORTED
      • 5. MANDATORY
      • 6. NEVER
      • 7. NESTED
    • 二、iOSlation
      • 三、timeout
        • 四、readOnly
          • 五、rollbackFor
            • 六、noRollbackFor

            Spring JdbcTemplate数据库事务参数

            @Transactional() 注解里有不少参数,其中我们常用到的如下:

            一、propagation

            表示事务传播行为。就是说多个事务方法之间进行调用,这个过程中事务是如何进行管理的。

            这里的事务方法就是指对数据库表数据进行变化操作的方法。

            举例:

            有个 update() 方法:

            public void update() {
            }

            还有个 add() 方法:

            public void add() {
            // 调用了update()方法
            update()
            }

            那么,现在当其中一个方法加上了事务注解 @Transactional 后,调用执行过程是怎样的?或者说两个都加了事务注解,又该如何?

            为了解决问题,spring 事务传播行为有 7 种:

            • REQUIRED:默认参数。如果有事务在运行,当前方法就在这个事务内运行,否则就开启一个新的事务,并在自己的事务内运行。
            • REQUIRES_NEW:当前的方法必须在启动新事务,并在它自己的事务内运行,如果有事务在进行,应该将它挂起。
            • SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中。
            • NOT_SUPPORTED:当前的方法不应该运行在事务中,如果有运行的事务,将它挂起。
            • MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常。
            • NEVER:当前的方法不应该在事务中运行,如果有运行的事务,就抛出异常。
            • NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在自己的事务内运行。

            1. REQUIRED

            如果有事务在运行,当前方法就在这个事务内运行,否则就开启一个新的事务,并在自己的事务内运行。

            @Transactional(propagation = Propagation.REQUIRED)
            public void methodA() {
            methodB();
            // do something
            }
            @Transactional(propagation = Propagation.REQUIRED)
            public void methodB() {
            // do something
            }

            当调用 methodA 时,因为当前上下文不存在事务,所以会开启一个新的事务。当执行到 methodB 时,发现当前上下文存在事务,因此就加入到当前事务来执行。当单独调用 methodB 时,因为当前上下文不存在事务,所以会开启一个新的事务。

            2. REQUIRES_NEW

            当前的方法必须在启动新事务,并在它自己的事务内运行,如果有事务在进行,应该将它挂起。

            @Transactional(propagation = Propagation.REQUIRED)
            public void methodA() {
            doSomeThingA();
            methodB();
            doSomeThingB();
            // do something else
            }
            // 事务属性为REQUIRES_NEW
            @Transactional(propagation = Propagation.REQUIRES_NEW)
            public void methodB() {
            // do something
            }

            当调用 methodA 时,开启了 事务 A。执行到 methodB 时,开启一个事务B,此时事务 A 挂起,当事务 B 执行完成后,继续执行事务 A 。

            • 这里的事务 A 称为外层事务。
            • 这里的事务 B 则称为内层事务。

            3. SUPPORTS

            如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中。

            @Transactional(propagation = Propagation.REQUIRED)
            public void methodA() {
            methodB();
            // do something
            }
            // 事务属性为SUPPORTS
            @Transactional(propagation = Propagation.SUPPORTS)
            public void methodB() {
            // do something
            }

            当调用 methodA 时,methodB 加入到 methodA 的事务中,事务的执行。当单独的调用 methodB 时,methodB方法是非事务的执行的。

            4. NOT_SUPPORTED

            当前的方法不应该运行在事务中,如果有运行的事务,将它挂起。

            • 当调用 methodA 时,开启 事务 A。当执行到 methodB 时,挂起事务A,以非事务的方式执行 methodB 。
            • 当单独的调用 methodB 时,methodB方法是非事务的执行的。

            5. MANDATORY

            当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常。

            @Transactional(propagation = Propagation.REQUIRED)
            public void methodA() {
            methodB();
            // do something
            }
            // 事务属性为MANDATORY
            @Transactional(propagation = Propagation.MANDATORY)
            public void methodB() {
            // do something
            }

            当调用 methodA 时,methodB 则加入到 methodA 的事务中,事务地执行。当单独调用 methodB 时,因为当前没有一个活动的事务,则会抛出异常。

            6. NEVER

            当前的方法不应该在事务中运行,如果有运行的事务,就抛出异常。

            7. NESTED

            如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在自己的事务内运行。

            • 当单独执行 methodB ,开启事务 B,执行。
            • 当执行 methodA 时,开启事务 A,执行到 methodB,开启内层事务 B。

            注意 当执行 methodA 时,这里是一个嵌套事务。

            如果外层事务失败,则会回滚内层事务所做的操作。但是内层事务的失败不会引起外层事务的回滚。

            二、ioslation

            设置事务隔离级别。

            因为不同的事务隔离级别会引起不同的问题,比如:脏读、不可重复读、幻读。

            相关的内容在之前有过介绍,有兴趣的可以自行跳转过去:

            【Mysql】数据库事务,脏读、幻读、不可重复读

            所以要解决,需要设置对应的隔离级别:

            • READ_UNCOMMITTED: 读未提交
            • READ_COMMITTED: 读已提交
            • REPEATABLE_READ: 可重复读
            • SERIALIZABLE: 串行化

            三、timeout

            设置超时时间。

            事务需要在一定时间内进行提交,如果没提交,就回滚。

            默认值是 -1 ,表示不超时。如果设置时间,单位是秒(s)。

            四、readOnly

            设置是否只读。

            默认值 false,表示可以查询,也可以进行添加、修改、删除操作。

            当设置为 true,只可以进行查询操作。

            五、rollbackFor

            设置出现哪些异常后就进行事务的回滚。

            六、noRollbackFor

            设置出现哪些异常后,不进行事务的回滚。

            以上就是Spring学习JdbcTemplate数据库事务参数的详细内容,更多关于Spring JdbcTemplate数据库事务的资料请关注其它相关文章!

            相关文章

            Oracle如何使用授予和撤销权限的语法和示例
            Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
            下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
            社区版oceanbase安装
            Oracle 导出CSV工具-sqluldr2
            ETL数据集成丨快速将MySQL数据迁移至Doris数据库

            发布评论