springboot分布式锁+标准手动事务

依赖

            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson</artifactId>
                <version>${redisson.version}</version>
            </dependency>

 

无异常流程

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.*;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

@Resource
PlatformTransactionManager transactionManager;

@GetMapping("/manualTransaction")
    public void manualTransaction() {
        RLock lock = null;
        try {
            lock = redissonClient.getLock("csLock");
            lock.lock();
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            def.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
            TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager, def);
            transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                @Override
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    try {
                        log.info("1.准备执行testSql()");
                        testSql();
                        log.info("2.testSql()执行完成");
                        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                            @Override
                            public void afterCommit() {
                                log.info("5.事务提交完成,走到这里事务才会真正提交");
                            }
                        });
                    } catch (Exception e) {
                        // 回滚事务
                        status.setRollbackOnly();
                        throw e;
                    }
                    //提交事务
                    log.info("3.status.flush()之前");
                    status.flush();
                    log.info("4.status.flush()之后");
                }
            });
        } catch (Exception e) {

        } finally {
            log.info("6.准备释放锁");
            if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }

    private void testSql(){
        SysLog sysLog1 = new SysLog();
        sysLog1.setLogContent("sysLog1");
        SysLog sysLog2 = new SysLog();
        sysLog2.setLogContent("sysLog2");
        sysLogMapper.insert(sysLog1);
        sysLogMapper.insert(sysLog2);
    }

日志

2024-03-24 11:29:17.377 [http-nio-40009-exec-1] INFO  org.jeecg.modules.MyTestController:213 - 1.准备执行testSql()
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c248a00]
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6ab80ea] will be managed by Spring
original SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
SQL to parse, SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
parse the finished SQL: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==>  Preparing: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==> Parameters: 1771741046124019713(String), 2024-03-24 11:29:17.383(Timestamp), sysLog1(String)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c248a00]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c248a00] from current transaction
original SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
SQL to parse, SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
parse the finished SQL: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==>  Preparing: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==> Parameters: 1771741046304374785(String), 2024-03-24 11:29:17.46(Timestamp), sysLog2(String)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c248a00]
2024-03-24 11:29:17.496 [http-nio-40009-exec-1] INFO  org.jeecg.modules.MyTestController:215 - 2.testSql()执行完成
2024-03-24 11:29:17.501 [http-nio-40009-exec-1] INFO  org.jeecg.modules.MyTestController:228 - 3.status.flush()之前
2024-03-24 11:29:26.566 [http-nio-40009-exec-1] INFO  org.jeecg.modules.MyTestController:230 - 4.status.flush()之后
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c248a00]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c248a00]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c248a00]
2024-03-24 11:29:26.585 [http-nio-40009-exec-1] INFO  org.jeecg.modules.MyTestController:219 - 5.事务提交完成,走到这里事务才会真正提交
2024-03-24 11:29:26.620 [http-nio-40009-exec-1] INFO  org.jeecg.modules.MyTestController:236 - 6.准备释放锁

出现异常流程

@GetMapping("/manualTransaction")
    public void manualTransaction() {
        RLock lock = null;
        try {
            lock = redissonClient.getLock("csLock");
            lock.lock();
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            def.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
            TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager, def);
            transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                @Override
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    try {
                        log.info("1.准备执行testSql()");
                        testSql();
                        log.info("testSql()下面不会执行");
                        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                            @Override
                            public void afterCommit() {
                                log.info("afterCommit不会执行");
                            }
                        });
                    } catch (Exception e) {
                        // 回滚事务
                        log.error("2.事务异常,进行回滚");
                        status.setRollbackOnly();
                        throw e;
                    }
                    //提交事务
                    log.info("status.flush()之前不会执行");
                    status.flush();
                    log.info("status.flush()之后不会执行");
                }
            });
        } catch (Exception e) {
            log.error("3.执行手动事务异常");
        } finally {
            log.info("4.准备释放锁");
            if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }

    private void testSql(){
        SysLog sysLog1 = new SysLog();
        sysLog1.setLogContent("sysLog1");
        SysLog sysLog2 = new SysLog();
        sysLog2.setLogContent("sysLog2");
        sysLogMapper.insert(sysLog1);
        sysLogMapper.insert(sysLog2);
        if (true){
            throw new RuntimeException("测试异常");
        }
    }
2024-03-24 11:51:21.114 [http-nio-40009-exec-2] INFO  org.jeecg.modules.MyTestController:257 - 1.准备执行testSql()
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e463425]
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@4ea4e0f3] will be managed by Spring
original SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
SQL to parse, SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
parse the finished SQL: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==>  Preparing: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==> Parameters: 1771746598254235650(String), 2024-03-24 11:51:21.118(Timestamp), sysLog1(String)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e463425]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e463425] from current transaction
original SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
SQL to parse, SQL: INSERT INTO sys_log  ( id,  create_time,           log_content )  VALUES  ( ?,  ?,           ? )
parse the finished SQL: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==>  Preparing: INSERT INTO sys_log (id, create_time, log_content) VALUES (?, ?, ?)
==> Parameters: 1771746598363287554(String), 2024-03-24 11:51:21.176(Timestamp), sysLog2(String)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e463425]
2024-03-24 11:51:21.204 [http-nio-40009-exec-2] ERROR org.jeecg.modules.MyTestController:268 - 2.事务异常,进行回滚
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e463425]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e463425]
2024-03-24 11:51:21.240 [http-nio-40009-exec-2] ERROR org.jeecg.modules.MyTestController:279 - 3.执行手动事务异常
2024-03-24 11:51:21.240 [http-nio-40009-exec-2] INFO  org.jeecg.modules.MyTestController:281 - 4.准备释放锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值