繁体   English   中英

在Spring MVC中管理交易

[英]manage transactions in spring mvc

我有两个表,我想用表一插入或更新表二。首先我选择表一并将结果添加到结果集中。然后我选择所有表二记录并将它们添加到列表中。然后我有一个迭代在结果集上并检查表1的记录是否在表2中,然后对其进行更新,以及表2中是否没有表1的记录保留新记录。但是在我的代码中,每次发生保留或更新不正确。

public static void main(String[] args) throws SQLException, ClassNotFoundException {
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/spring-servlet.xml");
    PersonManager personManager = (PersonManager) applicationContext.getBean("x");
        Person person=new Person();
        person.setPerson_Name("nazanin");
        person.setPerson_Family("qolamian");
        person.setPerson_Kill("1");
        personManager.registerPerson(person);
        personManager.updatePerson();
}

和我的personManager0:

public void updatePerson() throws ClassNotFoundException, SQLException {
    String getClass = "oracle.jdbc.driver.OracleDriver";
    String connectionStringOracle = "jdbc:oracle:thin:@localhost:1521:orcl";
    String userSqlServer = "solaris";
    String passSqlServer =  "myjava123";
    String queryStringSelectFromOracle="select * from people ORDER BY NAME ";
    Class.forName(getClass);
    Connection connection = DriverManager.getConnection(connectionStringOracle,userSqlServer ,passSqlServer );
    Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
            ResultSet.CONCUR_READ_ONLY);
    ResultSet resultSet = statement.executeQuery(queryStringSelectFromOracle);

    List<Person> personList =  entityManager.createQuery("select c from person c order by c.person_Name ASC ").getResultList();
    for (Person person : personList) {
        person.setPerson_Kill("0");
    }
    List<Person> personList1=new ArrayList<>();
    while (resultSet.next()){
        String rname = resultSet.getString("NAME");
        String rfamily = resultSet.getString("FAMILY");
        for (Person person : personList) {
            String name = person.getPerson_Name();
            String family = person.getPerson_Family();

            if (name.equals(rname)){
                if (family.equals(rfamily)){
                    person.setPerson_Kill("1");
                    break;
                }else {
                    person.setPerson_Family(rfamily);
                    person.setPerson_Kill("1");
                    break;
                }
            }else if (family.equals(rfamily)){
                    person.setPerson_Name(rname);
                    person.setPerson_Kill("1");
                    break;
                }else {
                Person person1 = new Person();
                person1.setPerson_Kill("1");
                person1.setPerson_Family(rfamily);
                person1.setPerson_Name(rname);
                personList1.add(person1);
            }

        }
    }
    if (personList1.isEmpty()){

    }else {
        for (Person person : personList1) {
            System.out.println("x");
            registerPerson(person);
        }
    }
}

我真的想知道交易在春季开始和结束时如何工作吗?我可以手动管理提交或关闭连接吗?

Spring使用AOP使声明式事务有效,当然,您可以手动控制事务边界。

请记住,在春季基于代理的声明式事务,因此,如果直接调用方法,例如在代码快照中,registerPerson()方法上的事务将无法工作

在您的Spring上下文中声明一个TransactionTemplate bean。

将TransactionTemplate自动连线到您的PersonManager

@Autowire
private TransactionTemplate txTemplate;

尝试以下快照:

txTemplate.execute(new TransactionCallback<Void>(){
    public Void doInTransaction(TransactionStatus txStatus){
    try{
        for (Person person : personList1) {
            System.out.println("x");
            registerPerson(person);
        }
    } catch(RuntimeException e){
        txStatus.setRollbackOnly();
        throw e;
    }
    return null;
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM