所谓事务,就是要么全部成功,要么全部失败,不允许包围在事务中的代码执行一半之类的.
如下代码,先注释调事务相关代码.
public class TransactionDemo {
public static void main(String[] args) throws IOException {
Properties config = new Properties();
//config.setProperty("transactional.id",System.currentTimeMillis()+"_"+"tid"); // 事务ID
config.setProperty("replication.factor", "3"); //要保证你的副本数至少大于等于3
config.setProperty("min.insync.replicas", "2"); //同时要求在写入一条数据过程中,必须要有一半以上副本写入成功才行
config.load(TransactionDemo.class.getClassLoader().getResourceAsStream("producer.properties"));
KafkaProducer<Integer, String> producer = new KafkaProducer<>(config);
//producer.initTransactions();
int start = 10;
int end = start + 10;
ProducerRecord<Integer, String> record = null;
try {
//producer.beginTransaction();
for (int i = start; i < end; i++) {
record = new ProducerRecord<Integer, String>("pet", i, i + " ");
producer.send(record);
if (i == 15) {
System.out.println(1 / 0);
}
}
// producer.commitTransaction();
} catch (Exception e) {
e.printStackTrace();
}
producer.close();
}
}
运行结果为,这个不符合事务的要求,要么全部成功,要么全部失败.因为我们要求打印10个.
10
11
13
12
14
15
下面开启事务.再次执行,结果一条也没有输出,说明事务成功,就是回滚成功了~
public class TransactionDemo {
public static void main(String[] args) throws IOException {
Properties config = new Properties();
config.setProperty("transactional.id",System.currentTimeMillis()+"_"+"tid"); // 事务ID
config.setProperty("replication.factor", "3"); //要保证你的副本数至少大于等于3
config.setProperty("min.insync.replicas", "2"); //同时要求在写入一条数据过程中,必须要有一半以上副本写入成功才行
config.load(TransactionDemo.class.getClassLoader().getResourceAsStream("producer.properties"));
KafkaProducer<Integer, String> producer = new KafkaProducer<>(config);
producer.initTransactions();
int start = 10;
int end = start + 10;
ProducerRecord<Integer, String> record = null;
try {
//开启事务
producer.beginTransaction();
for (int i = start; i < end; i++) {
record = new ProducerRecord<Integer, String>("pet", i, i + " ");
producer.send(record);
if (i == 15) {
System.out.println(1 / 0);
}
}
//提交事务
producer.commitTransaction();
} catch (Exception e) {
//如果失败,回滚,这步很关键!
producer.abortTransaction();
e.printStackTrace();
}
producer.close();
}
}
总结
- 所谓事务,就是要么全部成功,要么全部失败
- 事务失败时需要进行回滚操作