事务未提交,发送mq已经消费到数据 数据未更新

此处不解释事务隔离级别以及传播行为了哦。

有多种方式吧

1、如果是使用了@Transactional注释 那么可实现

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
public void suspend() {
}

public void resume() {
}

public void flush() {
}

public void beforeCommit(boolean readOnly) {
}

public void beforeCompletion() {
}
public void afterCompletion(int status) {
}
@Override
public void afterCommit() {
    // 发送任务消息
}

}

2、手动提交事务

import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Autowired
private DataSourceTransactionManager transactionManager;

public void method(){

//手动开启事务
DefaultTransactionDefinition transDefinition = new DefaultTransactionDefinition();
transDefinition.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus transStatus = transactionManager.getTransaction(transDefinition);
try {    
    //手动提交事务
    transactionManager.commit(transStatus);
} catch (Exception e) {
    log.error("delStrategy error {}", ExceptionUtils.getStackTrace(e));
    //事务回滚
    transactionManager.rollback(transStatus);
    throw new BizCommonException(StrategyErrorCode.DELETE_ERROR);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 Java 代码示例,用于将消息队列中的数据消费并写入 ClickHouse 数据库中: ```Java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.common.message.MessageExt; public class RocketMQConsumer { private static final String CLICKHOUSE_JDBC_DRIVER = "ru.yandex.clickhouse.ClickHouseDriver"; private static final String CLICKHOUSE_DB_URL = "jdbc:clickhouse://localhost:8123/default"; public static void main(String[] args) throws Exception { // 设置 RocketMQ 消费者 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup"); consumer.setNamesrvAddr("localhost:9876"); consumer.subscribe("Topic", "*"); // 注册 RocketMQ 消息监听器 consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage( java.util.List<MessageExt> msgs, ConsumeConcurrentlyContext context) { for (MessageExt msg : msgs) { // 将消息转换成 JSON 对象 String jsonString = new String(msg.getBody()); JSONObject json = JSON.parseObject(jsonString); // 构造 ClickHouse SQL 语句 String sql = "INSERT INTO mytable (field1, field2, field3) VALUES (?, ?, ?)"; // 获取 ClickHouse 连接 try (Connection conn = DriverManager.getConnection(CLICKHOUSE_DB_URL); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 设置 SQL 参数 pstmt.setString(1, json.getString("field1")); pstmt.setInt(2, json.getIntValue("field2")); pstmt.setDouble(3, json.getDoubleValue("field3")); // 执行 SQL 语句 pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } // 返回消费状态 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); // 启动 RocketMQ 消费者 consumer.start(); System.out.println("Consumer started"); } } ``` 在这个示例中,我们使用了 RocketMQ 的 DefaultMQPushConsumer 类来消费消息,然后将消息转换成 JSON 对象,并构造 ClickHouse 的 SQL 语句。接下来,我们获取 ClickHouse 的连接,并使用 PreparedStatement 对象设置 SQL 参数并执行 SQL 语句。最后,我们返回消费状态并启动消费者。 需要注意的是,在使用 ClickHouse JDBC 驱动程序时,需要将 ClickHouse JDBC 驱动程序添加到类路径中。可以从 ClickHouse 官网下载 ClickHouse JDBC 驱动程序,并将其添加到项目的 classpath 下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值