如何解决postgres中,用@Transactional注解,同一个事务内,先插入再查询,查询不到数据的问题
postgres mysql 事务
·
问题现象:
做数据库适配时,在postgres中,用@Transactional注解,同一个事务内,先插入再查询,查询不到数据的问题,但是在mysql中查询正常。
分析:
使用
show transaction_isolation;
查询postgres数据库的隔离级别发现是read committed
但是使用
select @@transaction_isolation;
在mysql查询时,mysql隔离级别是REPEATABLE-READ
于是在mysql和postgres里分别
start transaction;
执行先插入后查询,发现mysql正常,但是postgres会报错
ERROR: current transaction is aborted, commands ignored until end of transaction block
但是使用
START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
便可以正常先插入后查询
方案一:
将@Transactional改为如下
@Transactional(isolation = Isolation.REPEATABLE_READ ,rollbackFor = Exception.class)
但测试后发现还是不行,也是不太理解
方案二:
使用编程式事务,将插入语句的事务提前提交
@Resource
private DataSourceTransactionManager txManager;
//开启事务ts
TransactionStatus ts = txManager.getTransaction(tf) ;
boolean flag = false;
try {
flag = pjtBaseInfoService.insert(pjtBaseInfo);
txManager.commit(ts) ;
} catch (Exception e) {
log.error("插入数据失败:",e);
txManager.rollback(ts);
}
问题解决!
更多推荐
已为社区贡献1条内容
所有评论(0)