2015-08-13 24 views
7

Chciałem zrobić commit i wycofać za pomocą jdbcTemplate.Zatwierdź na jdbcTemplate lub DataSource

Moje pytanie jest oparty na this thread

Jak zatwierdzenie lub wycofanie zmian, należy zrobić to na jdbcTemplate jak

jdbcTemplate.commit(); 
jdbcTemplate.rollback(); 

lub istnieją inne sposoby osiągnięcia popełnić i wycofywania funkcjonalności przy użyciu jdbcTemplate.

+2

Użyj zarządzania transakcjami '@ Transactional' firmy Spring. –

Odpowiedz

0

najprostszy sposób zarządzania transakcjami wiosną jest @Transactional adnotacji, więc Twój kod będzie wyglądać bardzo prosta:

@Transactional(rollbackFor = Exception.class) 
public void doSomething(...) { 
    ... 
} 

czytaj więcej: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html

+0

Dzięki. Czy muszę ustawić na poziomie źródła danych? – Akhil

+0

Nie, wystarczy skonfigurować komponent bean txManager w swoim wiosennym kontekście. –

4

Aby połączyć commit lub rollback na ustawi transakcyjne granice programowo i nie deklaratywnie.

Z tego powodu musisz zdobyć PlatformTransactionManager - wstrzyknąć to, co jest w twoim DAO i samemu wykonać operację commit/rollback.

Przykładowy kod:

@Autowired private JdbcTemplate jdbcTemplate; 
@Autowired private PlatformTransactionManager platformTransactionManager; 

//.. 

public void daoMethod(params) { 
    DefaultTransactionDefinition paramTransactionDefinition = new DefaultTransactionDefinition(); 

    TransactionStatus status=platformTransactionManager.getTransaction(paramTransactionDefinition); 
try{ 
    String sqlQuery = "query"; 
    jdbcTemplate.update(sqlQuery, params); 
    platformTransactionManager.commit(status); 
}catch (Exception e) { 
    platformTransactionManager.rollback(status); 
} 

Innym podejściem jest zdobyć kod TransactionTemplate

próbki:

@Autowired private JdbcTemplate jdbcTemplate; 
@Autowired private TransactionTemplate transactionTemplate; 

//.. 


//for operations where query does not return like delete 
public void daoMethod(params) { 
    transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
    protected void doInTransactionWithoutResult(TransactionStatus paramTransactionStatus) { 
    try{ 
     String sqlQuery = "query"; 
     jdbcTemplate.update(query, params); 
    }catch (Exception e) { 
     paramTransactionStatus.setRollbackOnly(); 
    } 
    } 
    }); 
} 

//for operations where query does return like insert 
public int daoMethod(params) { 
return transactionTemplate.execute(new TransactionCallback<Integer>() { 
    public Integer doInTransaction(TransactionStatus paramTransactionStatus) { 
    String sqlQuery = "query"; 
    Object[] params = params; 
    int[] types = myTypes; 
    return jdbcTemplate.update(sqlQuery,params,types); 
    } 
}); 
}} 
+0

Dzięki. Czy muszę ustawić na poziomie źródła danych? – Akhil

0

jeśli skonfigurowaniu menedżer transakcji wiosna/jdbcTemplate prawidłowo, a następnie zawsze możesz użyć adnotacji @Transactional dostarczonych przez wiosnę, aby określić, kiedy chcesz wycofać transakcję, . Ale nawet jeśli zdefiniowałeś wycofanie, a twój sterownik jdbc lub twoja baza danych nie zezwala na transakcje (sprawdź TRANSACTION_ISOLATION przez JdbcConnection), to wiosna będzie logować się przy użyciu transakcji, ale baza danych po prostu zignoruje te punkty.

3

Użyj @Transactional. Ale oczywiście, zanim o tym, trzeba będzie stworzyć definicję fasoli dla DataSourceTransactionManager:

// Your DataSource bean definition 
@Bean 
public DataSource dataSource() { 
    .... 
} 

// Transaction manager bean definition 
@Bean 
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) { 
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); 
    dataSourceTransactionManager.setDataSource(dataSource); 

    return dataSourceTransactionManager; 
} 

a następnie można użyć @Transactional. Przykład usługi:

@Service 
public class MyServiceImpl { 

    @Autowired 
    private MyDAO myDAO; 

    @Transactional 
    public void insert(Entity entity) { 
     myDAO.insert(entity); 
    } 
}