gpt4 book ai didi

java - Spring PlatformTransactionManager - 并发事务

转载 作者:行者123 更新时间:2023-11-30 06:23:47 32 4
gpt4 key购买 nike

我正在实现一个 JDBC 数据库访问 API(基本上是一个包装器),并使用 Spring JdbcTemplatePlatformTransactionManager 来处理事务操作。一切看起来都不错,但我无法理解 jdbcTemplate 如何管理并发事务。我给大家举一个基于学生创作的简化例子来阐述我的观点。让我们创建 2 个学生:John 和 Jack。第一个没有错误,第二个有一个错误,步骤和代码如下。

  • John 开始交易
  • 执行 John 插入而不提交
  • 等待 jack 插入
  • Jack 开始交易
  • 执行 Jack 插入时出现错误(age 为 null,但数据库需要 NON - NULL)
  • 回滚 Jack 事务
  • 提交 John 交易

StudentDAO

public class StudentJDBCTemplate implements StudentDAO {

private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
private PlatformTransactionManager transactionManager;

// constructor, getters and setters

public TransactionStatus startTransaction() throws TransactionException {
TransactionDefinition def = new DefaultTransactionDefinition();
transactionManager.getTransaction(def);
}

public void commitTransaction(TransactionStatus status) throws TransactionException {
transactionManager.commit(status);
}

public void rollbackTransaction(TransactionStatus status) throws TransactionException {
transactionManager.rollback(status);
}

public void create(String name, Integer age){
String SQL1 = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL1, name, age);
return;
}
}

主应用

public class MainApp {
public static void main(String[] args){
// setup db connection etc

StudentJDBCTemplate studentDao = new StudentJDBCTemplate();

TransactionStatus txJohn = studentDao.startTransaction();
TransactionStatus txJack = studentDao.startTransaction();

studentDao.create("John", 20);

try {
studentDao.create("Jack", null); // **FORCE EXCEPTION**
} catch(Exception e){
studentDao.rollback(txJack);
}
studentDao.commit(txJohn);
}
}

JdbcTemplate 如何知道 1 个事务正常但另一个事务不行?据我了解,尽管我们创建了 2 个事务,JdbcTemplate 仍会回滚 Jack AND John 事务,因为查询、执行和更新方法不需要 TransactionStatus 作为参数。这意味着 Spring jdbcTemplate 一次只支持 1 个事务?!

最佳答案

单个事务中的所有操作始终作为单个单元执行,因此要么全部提交,要么全部不提交。

如果 John 启动一个先插入然后更新的事务,那么两者(插入和更新)要么都会成功,要么都不会成功,并且不会受到 Jack 启动的事务的影响。

现在并发事务如何相互干扰由隔离级别控制,即一个事务如何查看另一个并发事务修改的数据。

关于java - Spring PlatformTransactionManager - 并发事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47633062/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com