如果事务中执行了ddl语句(create table, alter table, drop table等)会执行隐式事务提交,这就造成事务回滚的时候无法将ddl之前的数据回滚掉,造成数据不一致问题,所以需要严格将dml语句和ddl语句分开执行,比如可以执行完dml语句事务提交之后再执行。比如Spring中可以利用TransactionSynchronizationManager。如下:
if (TransactionSynchronizationManager.isActualTransactionActive()) {TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCompletion(int status) {if (status == TransactionSynchronization.STATUS_ROLLED_BACK) {//do something...}}});}
