国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

transaction 事務(wù) 開啟 關(guān)閉 不使用 手動(dòng)控制 spring springboot mybatis

這篇具有很好參考價(jià)值的文章主要介紹了transaction 事務(wù) 開啟 關(guān)閉 不使用 手動(dòng)控制 spring springboot mybatis。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

spring springboot mybatis 事務(wù)配置 Transactional的Propagation 開啟事務(wù) 關(guān)閉事務(wù)_globalcoding

省流:

單元測試時(shí),發(fā)現(xiàn)默認(rèn)是使用事務(wù)。想要關(guān)閉事務(wù),使用:

@Transactional(propagation = Propagation.NOT_SUPPORTED)

正文:

默認(rèn)是使用事務(wù)

做單元測試的時(shí)候,發(fā)現(xiàn)默認(rèn)是使用事務(wù)的。代碼和日志如下:

@RunWith(SpringRunner.class)
@MybatisPlusTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Rollback(false)
public class T1 {

    @Autowired
    private XxxMapper xxxMapper;

    @Test
    public void t1() {
        int i = 0;
        List<XxxDo> xxxDoList = getData();
        System.out.println("我的打?。翰迦霐?shù)量 count:" + xxxDoList.size());
        for (XxxDo o : xxxDoList) {
            XxxDo existed = xxxMapper.selectOne(new LambdaQueryWrapper<XxxDo>()
                                .eq(XxxDo::getId,o.getId()));
            if(null != existed){continue;}
            xxxMapper.insert(o);
            if(i==100){
                int a = 1/0;
            }
            i++;
        }
        System.out.println("我的打印:循環(huán)插入結(jié)束");
    }

    public List<XxxDo> getData(){
        ....
        return list;
    }

}

日志:

 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.3.0 
INFO  12-10-2023 07:39:41.014 main Started T1 in 13.452 seconds (JVM running for 17.662)
INFO  12-10-2023 07:39:41.297 main {dataSource-1} inited
INFO  12-10-2023 07:39:41.652 main Began transaction (1) for test context [DefaultTestContext@5a8c93 testClass = T1, testInstance = com.ali.cloud.test.T1@3bed3315, testMethod = t1@T1, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@119b0892 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@1a3e8e24 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@20d525, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@69453e37, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@4961f6af, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@f1c9823f, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@4c309d4d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@4ed4a7e4]; rollback [false]
我的打?。翰迦霐?shù)量 count: 2000
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@63f6bed1] will be managed by Spring
==>  Preparing: SELECT xxx from xxx where xxx
==> Parameters: 4444b1e53dxxx0d09bcaaa0c6362ayyy(String), 1234b1e53dxxx0d09bcaaa0c6362axxx(String), 0(Integer)
<==      Total: 0
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7] from current transaction
==>  Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? ) 
==> Parameters: 2342251622094285111(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7] from current transaction
==>  Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? ) 
==> Parameters: 2342251622094285112(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<==    Updates: 1

我的打?。貉h(huán)插入結(jié)束

Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
INFO  12-10-2023 07:40:10.436 main Committed transaction for test: [DefaultTestContext@5a8c93 testClass = T1, testInstance = com.ali.cloud.test.T1@3bed3315, testMethod = t1@T1, testException = java.lang.ArithmeticException: / by zero, mergedContextConfiguration = [MergedContextConfiguration@119b0892 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@1a3e8e24 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@20d525, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@69453e37, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@4961f6af, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@f1c9823f, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@4c309d4d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]
INFO  12-10-2023 07:40:10.455 SpringContextShutdownHook {dataSource-1} closing ...
INFO  12-10-2023 07:40:10.463 SpringContextShutdownHook {dataSource-1} closed

通過日志發(fā)現(xiàn),默認(rèn)用了事務(wù)transaction,這會(huì)有一個(gè)現(xiàn)象,就是在事務(wù)結(jié)束前,所有的insert是沒有commit的。也就是必須得等到程序結(jié)束,數(shù)據(jù)庫才會(huì)有數(shù)據(jù)存進(jìn)去。

并且,還發(fā)現(xiàn),如果中間出現(xiàn)異常,異常之前的數(shù)據(jù)是會(huì)提交到數(shù)據(jù)庫。

實(shí)驗(yàn):在程序跑起來,循環(huán)insert的時(shí)候,去查詢數(shù)據(jù)庫,是查不到這些數(shù)據(jù)的。

關(guān)閉事務(wù)

如果想要插入一條,數(shù)據(jù)庫就有一條,只需要不使用事務(wù)即可。關(guān)閉事務(wù)的方式是:在方法上加上如下注解:

@Transactional(propagation = Propagation.NOT_SUPPORTED)

    @Test
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void t1() {
        int i = 0;
        List<XxxDo> xxxDoList = getData();
        System.out.println("我的打印:插入數(shù)量 count:" + xxxDoList.size());
        for (XxxDo o : xxxDoList) {
            XxxDo existed = xxxMapper.selectOne(new LambdaQueryWrapper<XxxDo>()
                                .eq(XxxDo::getId,o.getId()));
            if(null != existed){continue;}
            xxxMapper.insert(o);
            if(i==100){
                int a = 1/0;
            }
            i++;
        }
        System.out.println("我的打?。貉h(huán)插入結(jié)束");
    }

?日志如下:

 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.3.0 
INFO  13-10-2023 09:37:55.641 main Started T1 in 13.353 seconds (JVM running for 16.686)
我的打印 count: 2293
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@37348491] was not registered for synchronization because synchronization is not active
INFO  13-10-2023 09:37:56.937 main {dataSource-1} inited
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==>  Preparing: SELECT xxx from xxx where xxx
==> Parameters: 5555b1e53dxxx0d09bcaaa0c6362ayyy(String), 1234b1e53dxxx0d09bcaaa0c6362axxx(String), 0(Integer)
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@37348491]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66bf40e5] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==>  Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? ) 
==> Parameters: 2342251622094285111(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66bf40e5]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a515e5d] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==>  Preparing: SELECT xxx from xxx where xxx
==> Parameters: 5555b1e53dxxx0d09bcaaa0c6362ayyy(String), 1234b1e53dxxx0d09bcaaa0c6362axxx(String), 0(Integer)
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a515e5d]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32f32623] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==>  Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? ) 
==> Parameters: 2342251622094285111(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32f32623]

我的打?。貉h(huán)插入結(jié)束

INFO  13-10-2023 09:38:00.505 SpringContextShutdownHook {dataSource-1} closing ...
INFO  13-10-2023 09:38:00.512 SpringContextShutdownHook {dataSource-1} closed

根據(jù)兩個(gè)日志對(duì)比,最明顯的區(qū)別是開啟事務(wù)的方法只創(chuàng)建了一個(gè)SqlSession,沒開啟事務(wù)的方法每一次執(zhí)行sql都會(huì)創(chuàng)建一個(gè)SqlSession。

日志里是這句話:Creating a new SqlSession

若開啟事務(wù),處理SqlSession的步驟:釋放SqlSession,再獲取SqlSession,再去執(zhí)行sql。

若關(guān)閉事務(wù),處理SqlSession的步驟:關(guān)閉SqlSession,再創(chuàng)建SqlSession,再去執(zhí)行sql。

當(dāng)然,還有更具體的細(xì)節(jié):

1. 開始都會(huì)先初始化數(shù)據(jù)源,最后都會(huì)關(guān)閉數(shù)據(jù)源。

日志:

{dataSource-1} inited,{dataSource-1} closing ...,{dataSource-1} closed

2. jdbc connection都用的是同一個(gè),但兩處日志不一樣,一個(gè)是交給spring管理,一個(gè)是沒交給spring管理。

日志:

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@63f6bed1] will be managed by Spring

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring

手動(dòng)控制事務(wù)

單獨(dú)對(duì)某句sql做一個(gè)事務(wù),即手動(dòng)控制事務(wù)。

增加如下4行代碼

            DefaultTransactionDefinition dt = new DefaultTransactionDefinition();
            dt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            TransactionStatus status = platformTransactionManager.getTransaction(dt);
            platformTransactionManager.commit(status);

用法是:包裹住執(zhí)行sql語句即可。?

            DefaultTransactionDefinition dt = new DefaultTransactionDefinition();
            dt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            TransactionStatus status = platformTransactionManager.getTransaction(dt);
            mapper.insert(o);
            platformTransactionManager.commit(status);

這是將查詢和插入都包裹住的日志:

    @Autowired
    private PlatformTransactionManager platformTransactionManager;
    
    @Test
    public void t1(){
        for(int i=0; i<list.size(); i++){
            DefaultTransactionDefinition dt = new DefaultTransactionDefinition();
            dt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            TransactionStatus status = platformTransactionManager.getTransaction(dt);
            mapper.select(o);
            mapper.insert(o);
            platformTransactionManager.commit(status);
        }
    }
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.3.0 
INFO  13-10-2023 17:53:24.989 main Started T1 in 12.882 seconds (JVM running for 16.576)
INFO  13-10-2023 17:53:25.302 main {dataSource-1} inited
INFO  13-10-2023 17:53:25.682 main Began transaction (1) for test context [DefaultTestContext@4ed4a7e4 testClass = T1, testInstance = com.ali.cloud.iot.T1@1c7350b0, testMethod = t1@T1, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@55651434 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@3bc4ef12 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@587e5365, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@63475ace, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@291caca8, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@44ef74f7, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@38e79ae3], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@50448409]; rollback [false]
我的打印 count: 2293
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32faa16c]
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6ea246af] will be managed by Spring
==>  Preparing: SELECT xxx
==> Parameters: xxx
<==      Total: 0
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32faa16c]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32faa16c] from current transaction
==>  Preparing: INSERT INTO xxx
==> Parameters: xxx
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32faa16c]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32faa16c]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32faa16c]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32faa16c]
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e1ffe70]
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6ea246af] will be managed by Spring
==>  Preparing: SELECT xxx
==> Parameters: xxx
<==      Total: 0
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e1ffe70]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e1ffe70] from current transaction
==>  Preparing: INSERT INTO xxx
==> Parameters: xxx
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e1ffe70]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e1ffe70]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e1ffe70]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e1ffe70]

我的打?。貉h(huán)插入結(jié)束

INFO  13-10-2023 17:53:29.971 main Committed transaction for test: [DefaultTestContext@4ed4a7e4 testClass = T1, testInstance = com.ali.cloud.iot.T1@1c7350b0, testMethod = t1@T1, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@55651434 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@3bc4ef12 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@587e5365, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@63475ace, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@291caca8, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@44ef74f7, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@38e79ae3], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]
INFO  13-10-2023 17:53:29.982 SpringContextShutdownHook {dataSource-1} closing ...
INFO  13-10-2023 17:53:29.993 SpringContextShutdownHook {dataSource-1} closed

這是查詢?cè)谕饷?,單?dú)包裹住插入的日志:

        for(int i=0; i<list.size(); i++){
            mapper.select(o);
            DefaultTransactionDefinition dt = new DefaultTransactionDefinition();
            dt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            TransactionStatus status = platformTransactionManager.getTransaction(dt);
            mapper.insert(o);
            platformTransactionManager.commit(status);
        }
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.3.0 
INFO  13-10-2023 18:58:43.950 main Started T1 in 18.362 seconds (JVM running for 22.704)
INFO  13-10-2023 18:58:44.356 main {dataSource-1} inited
INFO  13-10-2023 18:58:45.206 main Began transaction (1) for test context [DefaultTestContext@1a3e8e24 testClass = T1, testInstance = com.ali.cloud.iot.T1@4ed4a7e4, testMethod = t1@T1, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@1c7350b0 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@55651434 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@587e5365, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@63475ace, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@291caca8, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@44ef74f7, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@38e79ae3], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@3bc4ef12]; rollback [false]
我的打印:count: 2293
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@29fe4840] will be managed by Spring
==>  Preparing: SELECT xxxx
==> Parameters: xxx
<==      Total: 0
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
Transaction synchronization suspending SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7b25ab31]
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@494c8f29] will be managed by Spring
==>  Preparing: INSERT INTO xxx
==> Parameters: xxx
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7b25ab31]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7b25ab31]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7b25ab31]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7b25ab31]
Transaction synchronization resuming SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c] from current transaction
==>  Preparing: SELECT xxx
==> Parameters: xxx
<==      Total: 0
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
Transaction synchronization suspending SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@574059d5]
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@494c8f29] will be managed by Spring
==>  Preparing: INSERT INTO xxx
==> Parameters: xxx
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@574059d5]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@574059d5]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@574059d5]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@574059d5]
Transaction synchronization resuming SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]

我的打?。貉h(huán)插入結(jié)束

Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16da476c]
INFO  13-10-2023 18:58:50.166 main Committed transaction for test: [DefaultTestContext@1a3e8e24 testClass = T1, testInstance = com.ali.cloud.iot.T1@4ed4a7e4, testMethod = t1@T1, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@1c7350b0 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@55651434 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@587e5365, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@63475ace, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@291caca8, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@44ef74f7, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@38e79ae3], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]
INFO  13-10-2023 18:58:50.179 SpringContextShutdownHook {dataSource-1} closing ...
INFO  13-10-2023 18:58:50.190 SpringContextShutdownHook {dataSource-1} closed

根據(jù)日志,兩種區(qū)別是:

第2種沒有將查詢包裹的,他是從事務(wù)中取出的session,fetched sqlsession from transaction,被包裹住的那個(gè)插入語句他是重新創(chuàng)建的session,creating a?new sqlsession。

也就是說代碼執(zhí)行邏輯是這樣:進(jìn)入for循環(huán)->創(chuàng)建sqlsession1,執(zhí)行查詢sql,釋放sqlsession1,掛起sqlsession1->進(jìn)入到獨(dú)立手動(dòng)控制事務(wù)的代碼->創(chuàng)建sqlsession2-,執(zhí)行插入sql,釋放、提交、注銷、關(guān)閉sqlsession2,恢復(fù)sqlsession1->取出sqlsession1,執(zhí)行查詢sql,釋放sqlsession1,掛起sqlsession1->...最后執(zhí)行完了,走出for循環(huán),執(zhí)行其他代碼,走出方法,提交、注銷、關(guān)閉sqlsession1->關(guān)閉datasource

======================分割線==========================

文章到此已經(jīng)結(jié)束,以下是紫薯布丁

@RunWith(SpringRunner.class)
@MybatisPlusTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Rollback(false)
public class T1 {

? ? @Autowired
? ? private XxxMapper xxxMapper;

? ? @Test

@Transactional(propagation = Propagation.NOT_SUPPORTED)
? ? public void t1() {
? ? ? ? int i = 0;
? ? ? ? List<XxxDo> xxxDoList = getData();
? ? ? ? System.out.println("我的打印:插入數(shù)量 count:" + xxxDoList.size());
? ? ? ? for (XxxDo o : xxxDoList) {
? ? ? ? ? ? XxxDo existed = xxxMapper.selectOne(new LambdaQueryWrapper<XxxDo>()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .eq(XxxDo::getId,o.getId()));
? ? ? ? ? ? if(null != existed){continue;}
? ? ? ? ? ? xxxMapper.insert(o);
? ? ? ? ? ? if(i==100){
? ? ? ? ? ? ? ? int a = 1/0;
? ? ? ? ? ? }
? ? ? ? ? ? i++;
? ? ? ? }
? ? ? ? System.out.println("我的打?。貉h(huán)插入結(jié)束");
? ? }

? ? public List<XxxDo> getData(){
? ? ? ? ....
? ? ? ? return list;
? ? }

}
?

?_ _ ? |_ ?_ _|_. ___ _ | ? ?_?
| | |\/|_)(_| | |_\ ?|_)||_|_\?
? ? ?/ ? ? ? ? ? ? ? | ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? 3.3.0?
INFO ?12-10-2023 07:39:41.014 main Started T1 in 13.452 seconds (JVM running for 17.662)
INFO ?12-10-2023 07:39:41.297 main {dataSource-1} inited
INFO ?12-10-2023 07:39:41.652 main Began transaction (1) for test context [DefaultTestContext@5a8c93 testClass = T1, testInstance = com.ali.cloud.test.T1@3bed3315, testMethod = t1@T1, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@119b0892 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@1a3e8e24 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@20d525, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@69453e37, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@4961f6af, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@f1c9823f, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@4c309d4d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@4ed4a7e4]; rollback [false]
我的打?。翰迦霐?shù)量 count: 2000
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@63f6bed1] will be managed by Spring
==> ?Preparing: SELECT xxx from xxx where xxx
==> Parameters: 4444b1e53dxxx0d09bcaaa0c6362ayyy(String), 1234b1e53dxxx0d09bcaaa0c6362axxx(String), 0(Integer)
<== ? ? ?Total: 0
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7] from current transaction
==> ?Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? )?
==> Parameters: 2342251622094285111(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<== ? ?Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7] from current transaction
==> ?Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? )?
==> Parameters: 2342251622094285112(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<== ? ?Updates: 1

我的打?。貉h(huán)插入結(jié)束

Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e62ead7]
INFO ?12-10-2023 07:40:10.436 main Committed transaction for test: [DefaultTestContext@5a8c93 testClass = T1, testInstance = com.ali.cloud.test.T1@3bed3315, testMethod = t1@T1, testException = java.lang.ArithmeticException: / by zero, mergedContextConfiguration = [MergedContextConfiguration@119b0892 testClass = T1, locations = '{}', classes = '{class com.ali.cloud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@1a3e8e24 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration, com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@20d525, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@69453e37, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@4961f6af, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@f1c9823f, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@4c309d4d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]
INFO ?12-10-2023 07:40:10.455 SpringContextShutdownHook {dataSource-1} closing ...
INFO ?12-10-2023 07:40:10.463 SpringContextShutdownHook {dataSource-1} closed

?_ _ ? |_ ?_ _|_. ___ _ | ? ?_?
| | |\/|_)(_| | |_\ ?|_)||_|_\?
? ? ?/ ? ? ? ? ? ? ? | ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? 3.3.0?
INFO ?13-10-2023 09:37:55.641 main Started T1 in 13.353 seconds (JVM running for 16.686)
我的打印 count: 2293
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@37348491] was not registered for synchronization because synchronization is not active
INFO ?13-10-2023 09:37:56.937 main {dataSource-1} inited
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==> ?Preparing: SELECT xxx from xxx where xxx
==> Parameters: 5555b1e53dxxx0d09bcaaa0c6362ayyy(String), 1234b1e53dxxx0d09bcaaa0c6362axxx(String), 0(Integer)
<== ? ? ?Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@37348491]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66bf40e5] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==> ?Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? )?
==> Parameters: 2342251622094285111(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<== ? ?Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66bf40e5]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a515e5d] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==> ?Preparing: SELECT xxx from xxx where xxx
==> Parameters: 5555b1e53dxxx0d09bcaaa0c6362ayyy(String), 1234b1e53dxxx0d09bcaaa0c6362axxx(String), 0(Integer)
<== ? ? ?Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a515e5d]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32f32623] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@259b85d6] will not be managed by Spring
==> ?Preparing: INSERT INTO xxx( xxx ) VALUES ( ?, ?, ?, ?, ?, ? )?
==> Parameters: 2342251622094285111(String),xxx, 2023-10-12 07:39:42.762(Timestamp), global_coding(String), 2023-10-12 07:39:42.762(Timestamp), global_coding(String)
<== ? ?Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@32f32623]

我的打?。貉h(huán)插入結(jié)束

INFO ?13-10-2023 09:38:00.505 SpringContextShutdownHook {dataSource-1} closing ...
INFO ?13-10-2023 09:38:00.512 SpringContextShutdownHook {dataSource-1} closed文章來源地址http://www.zghlxwxcb.cn/news/detail-771829.html

到了這里,關(guān)于transaction 事務(wù) 開啟 關(guān)閉 不使用 手動(dòng)控制 spring springboot mybatis的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 工具的服務(wù)端口已關(guān)閉。要使用命令行調(diào)用工具,請(qǐng)?jiān)谙路捷斎?y 以確認(rèn)開啟,或手動(dòng)打開工具 -> 設(shè)置 -> 安全設(shè)置,將服務(wù)端口開啟

    工具的服務(wù)端口已關(guān)閉。要使用命令行調(diào)用工具,請(qǐng)?jiān)谙路捷斎?y 以確認(rèn)開啟,或手動(dòng)打開工具 -> 設(shè)置 -> 安全設(shè)置,將服務(wù)端口開啟

    問題:工具的服務(wù)端口已關(guān)閉。要使用命令行調(diào)用工具,請(qǐng)?jiān)谙路捷斎?y 以確認(rèn)開啟,或手動(dòng)打開工具 - 設(shè)置 - 安全設(shè)置,將服務(wù)端口開啟 解決方式:打開微信開發(fā)者工具——設(shè)置——安全——服務(wù)端口(開啟)

    2024年02月11日
    瀏覽(20)
  • Spring的事務(wù)(@Transactional)

    Spring事務(wù)的本質(zhì),其實(shí)就是通過 Spring AOP 切面技術(shù) Spring事務(wù)支持2種使用方式 聲明式事務(wù)(注解方式) 編程式事務(wù)(代碼方式):代碼需要手動(dòng)控制,比較繁瑣,一般不使用 SpringBoot 默認(rèn)開啟了事務(wù) Spring Spring的事務(wù)是使用AOP來實(shí)現(xiàn)的,在執(zhí)行目標(biāo)方法的前和后,加上了事務(wù)

    2024年02月21日
    瀏覽(21)
  • SpringBoot開啟動(dòng)態(tài)定時(shí)任務(wù)并手動(dòng)、自動(dòng)關(guān)閉

    場景需求:在執(zhí)行某個(gè)方法的兩小時(shí)之后進(jìn)行某個(gè)操作 涉及:定時(shí)任務(wù)、哈希表 需要注意: 業(yè)務(wù)邏輯層是單一實(shí)例的,所以在定時(shí)任務(wù)類內(nèi)操作業(yè)務(wù)邏輯層的某個(gè)屬性和在業(yè)務(wù)邏輯層內(nèi)操作的都是同一個(gè)。 使用Map存放數(shù)據(jù)不要用IdentityHashMap,因?yàn)镮dentityHashMap比較key值用的是

    2024年01月24日
    瀏覽(34)
  • spring-transaction源碼分析(3)Transactional事務(wù)失效原因

    spring-transaction源碼分析(3)Transactional事務(wù)失效原因

    在Transactional方法中使用this方式調(diào)用另一個(gè)Transactional方法時(shí),攔截器無法攔截到被調(diào)用方法,嚴(yán)重時(shí)會(huì)使事務(wù)失效。 類似以下代碼: 正常情況下,執(zhí)行到\\\"繼續(xù)插入數(shù)據(jù)\\\"時(shí)會(huì)拋出一個(gè)\\\"rollback only\\\"的異常,然后事務(wù)回滾。 而現(xiàn)在的現(xiàn)象是: 三個(gè)操作都不會(huì)開啟事務(wù),出現(xiàn)異常

    2024年02月03日
    瀏覽(30)
  • Spring @Transactional事務(wù)傳播機(jī)制詳解

    我們?nèi)粘9ぷ髦袠O少使用事務(wù)傳播級(jí)別,單純只是使用事務(wù)和rollbackfor拋出異常來解決事務(wù)問題,但其實(shí)我們很多時(shí)候使用的是不正確的,或者說會(huì)造成事務(wù)粒度過大,本文詳解一下事務(wù)傳播級(jí)別,也讓自己更好地處理事務(wù)問題。 1.什么是事務(wù)傳播機(jī)制? 舉個(gè)栗子,方法A是一

    2024年02月14日
    瀏覽(25)
  • Spring——事務(wù)注解@Transactional【建議收藏】

    Spring——事務(wù)注解@Transactional【建議收藏】

    在某些業(yè)務(wù)場景下,如果一個(gè)請(qǐng)求中,需要同時(shí)寫入多張表的數(shù)據(jù)或者執(zhí)行多條sql,為了保證操作的原子性(要么同時(shí)成功,要么同時(shí)失敗),避免數(shù)據(jù)不一致的情況,我們一般都會(huì)用到事務(wù);Spring框架下,我們經(jīng)常會(huì)使用@Transactional注解來管理事務(wù); 本篇介紹Spring的事務(wù)注

    2024年02月03日
    瀏覽(24)
  • Spring 事務(wù)(編程式事務(wù)、聲明式事務(wù)@Transactional、事務(wù)隔離級(jí)別、事務(wù)傳播機(jī)制)

    Spring 事務(wù)(編程式事務(wù)、聲明式事務(wù)@Transactional、事務(wù)隔離級(jí)別、事務(wù)傳播機(jī)制)

    本篇重點(diǎn)總結(jié): 在 Spring 項(xiàng)目中使用事務(wù),有兩種方式:編程式手動(dòng)操作和聲明式自動(dòng)提交,聲明式自動(dòng)提交使用最多,只需要在方法上添加注解 @Transactional 設(shè)置事務(wù)的隔離級(jí)別 @Transactional(isolation = Isolation.SERIALIZABLE),Spring 中的事務(wù)隔離級(jí)別有5種 設(shè)置事務(wù)的傳播機(jī)制 @Tra

    2024年02月03日
    瀏覽(54)
  • 【spring(四)】Spring事務(wù)管理和@Transactional注解

    【spring(四)】Spring事務(wù)管理和@Transactional注解

    ??鍵盤敲爛,年薪30萬?? 目錄 Spring中的事務(wù)管理 問題拋出: 解決方案: @Transactional注解: rollbackFor屬性: propagation屬性: 應(yīng)用: ??總結(jié) 知識(shí)回顧: ?什么是事務(wù) 事務(wù)是對(duì)數(shù)據(jù)操作的集合,它是數(shù)據(jù)操作的最小執(zhí)行單位,也就是說,要么一個(gè)事務(wù)中操作全部執(zhí)行完畢,

    2024年01月17日
    瀏覽(62)
  • 【P30】JMeter 事務(wù)控制器(Transaction Controller)

    【P30】JMeter 事務(wù)控制器(Transaction Controller)

    可以生成一個(gè)額外的樣本,這樣能夠?qū)⑺乃凶釉刈鳛橐粋€(gè)計(jì)量單元進(jìn)行監(jiān)聽;事務(wù)控制器本身不包含任何業(yè)務(wù)邏輯,只是組合出一個(gè)新的計(jì)量單元 選擇線程組右鍵 添加 邏輯控制器 事務(wù)控制器(Transaction Controller) Generate parent sample:選中,事務(wù)控制器將作為其他取樣器

    2024年02月06日
    瀏覽(28)
  • 【JavaEE】Spring事務(wù)-@Transactional參數(shù)介紹-事務(wù)的隔離級(jí)別以及傳播機(jī)制

    【JavaEE】Spring事務(wù)-@Transactional參數(shù)介紹-事務(wù)的隔離級(jí)別以及傳播機(jī)制

    【JavaEE】Spring 事務(wù)(2) 參數(shù) 作用 value 當(dāng)配置了多個(gè)事務(wù)管理器時(shí),可以使用該屬性指定選擇哪個(gè)事務(wù)管理器 transactionManager 當(dāng)配置了多個(gè)事務(wù)管理器時(shí),可以使用該屬性指定選擇哪個(gè)事務(wù)管理器 isolation 事務(wù)的隔離級(jí)別.默認(rèn)值為solation.DEFAULT propagation 事務(wù)的傳播機(jī)制,默認(rèn)值

    2024年02月10日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包