2015-08-13 12 views
7

Ich wollte Commit und Rollback mit JDBCTemplate tun.Commit on jdbcTemplate oder DataSource

Meine Frage basiert auf this thread

Wie kann ich Commit oder Rollback, sollte ich tun es auf jdbcTemplate wie

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

Oder gibt es einige andere Möglichkeiten, begehen zu erreichen und Rollback-Funktionalität jdbcTemplate verwenden.

+2

Verwenden Sie die Transaktionstransaktion "@ Transactional" von Spring. –

Antwort

4

bei commit oder rollback aufrufen wird die Transaktions eingestellt Grenzen programmatisch und nicht deklarativ.

Aus diesem Grund müssen Sie die PlatformTransactionManager - injizieren Sie es, die in Ihrem DAO ist und die commit/rollback Operation selbst durchführen.

Beispielcode:

@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); 
} 

Ein weiterer Ansatz ist Halt des TransactionTemplate

Beispielcode zu erhalten:

@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

Vielen Dank. Muss ich auf Datenquellenebene festlegen? – Akhil

0

, wenn Sie die Feder Transaktionsmanager/jdbcTemplate richtig konfiguriert haben, dann Sie können jederzeit die von Spring bereitgestellten @Transactional-Anmerkungen verwenden, um festzulegen, wann eine Transaktion zurückgesetzt werden soll oder nicht . Aber auch wenn Sie einen Rollback definiert haben und Ihr jdbc-Treiber oder Ihre Datenbank keine Transaktionen zulassen (überprüfen Sie TRANSACTION_ISOLATION über JdbcConnection), dann protokolliert spring die Transaktionen, aber die Datenbank ignoriert diese Punkte einfach.

3

Verwenden Sie @Transactional. Aber natürlich, dass vor, Sie müssen Bohne Definition für 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; 
} 

Und dann können Sie @Transactional verwenden. Beispiel für einen Service:

@Service 
public class MyServiceImpl { 

    @Autowired 
    private MyDAO myDAO; 

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