如果事务中执行了ddl语句(create table, alter table, drop table等)会执行隐式事务提交,这就造成事务回滚的时候无法将ddl之前的数据回滚掉,造成数据不一致问题,所以需要严格将dml语句和ddl语句分开执行,比如可以执行完dml语句事务提交之后再执行。比如Spring中可以利用TransactionSynchronizationManager。如下:

    1. if (TransactionSynchronizationManager.isActualTransactionActive()) {
    2. TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
    3. @Override
    4. public void afterCompletion(int status) {
    5. if (status == TransactionSynchronization.STATUS_ROLLED_BACK) {
    6. //do something...
    7. }
    8. }
    9. });
    10. }