依赖
<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.准备释放锁