关于mysql数据库,默许情况下,数据库处于主动提交形式。每一条句子处于一个独自的事务中,在这条句子履行完毕时,假如履行成功则隐式的提交事务,假如履行失利则隐式的回滚业务。关于正常的事务管理,是一组相关的操作处于一个事务之中,因而有必要封闭数据库的主动提交形式,下面是检查办法: 检查是否主动提交指令(ON表明敞开主动提交,值为1,OFF表明封闭主动提交,值为0):
封闭主动提交后,则用户将一向处于某个事务中,直到履行一条commit提交或rollback句子才会完毕当时业务重新开端一个新的事务。
connection.setAutoCommit(false);
事务阻隔等级
TransactionDefinition.ISOLATION_DEFAULT:这是默许值,表明运用底层数据库的默许阻隔等级。对大部分数据库而言,一般这值便是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_COMMITTED:该阻隔等级表明一个业务只能读取另一个事务现已提交的数据。该等级能够避免脏读,这也是大多数情况下的推荐值。
TransactionDefinition.ISOLATION_SERIALIZABLE:一切的业务顺次逐一履行,这样事务之间就彻底不可能发生搅扰,也便是说,该等级能够避免脏读、不可重复读以及幻读。可是这将严重影响程序的功能。一般情况下也不会用到该等级。
所谓事务的传达行为是指,假如在开端当时事务之前,一个事务上下文现已存在,此刻有若干选项能够指定一个事务性办法的履行行为。在TransactionDefinition界说中包含了如下几个表明传达行为的常量:
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创立一个新的事务,假如当时存在事务,则把当时事务挂起。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务办法运转,假如当时存在事务,则把当时事务挂起。
TransactionDefinition.PROPAGATION_MANDATORY:假如当时存在业务,则参加该业务;假如当时没有业务,则抛出反常。
维护点(Savepoints)
当履行rollback时,经过指定保存点能够回退到指定的点。
A8站源码交易平台
撤销保存点a之后事务 rollback to a
留意:这个回退事务,有必要是没有commit前运用的;
public class UserRepository {
private DataSource masterDataSource;
@Autowired
this.masterDataSource = masterDataSource;
@Transactional
try {
connection.setAutoCommit(false);
Savepoint saveUser = connection.setSavepoint("saveUser");
prepareStatement.setLong(1, user.getId());
prepareStatement.setInt(3, user.getAge());
try {
} catch (Exception e) {
//回滚至维护点
}
} catch (SQLException e) {
} finally {
connection.close();
e.printStackTrace();
}
}
System.out.println("save user:"+user);
PreparedStatement prepareStatement = connection.prepareStatement("update user set name = ? ,age = ? where id = ?)");
prepareStatement.setString(1, "王大拿");
prepareStatement.execute();
} catch (SQLException e) {
}
}
A8站源码交易平台