数据库(Spring事务)
1、建立连接、开启事务(准备工作)
2、进行sql操作(业务逻辑)
3、执行成功,则commit;
执行失败,则rollback
总:Spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,通过通知来完成核心功能,但是事务不是通过通知来实现的,而是通过一个TransactionInteceptor来实现的,然后调用invoke来实现具体的逻辑
分:1、先做准备工作,解析各个方法上事务相关的属性(隔离性、传播特性),根据具体的属性来判断是否开启新事物
2、当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事务
3、执行具体的sql逻辑操作
4、在操作过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollBack来实现的,实现的时候也要获取连接对象,通过连接对象来回滚
protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) {
// 判断当前是否存在事务
if (txInfo != null && txInfo.hasTransaction()) {
if (logger.isTraceEnabled()) {
logger.trace("Completing transaction for [" + txInfo.getJoinpointIdentification() +
"] after exception: " + ex);
}
// 判断是否满足回滚条件
if (txInfo.transactionAttribute.rollbackOn(ex)) {
try {
// 回滚处理
txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
}
// 其余代码
}
else {
try {
// 如果不满足回滚条件出现异常也会继续提交
txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
}
// 其余代码
}
}
}
回滚操作,获取当前线程的数据库连接并调用其rollback方法进行回滚,使用的是底层数据库protected void doRollback(DefaultTransactionStatus status) {
DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction();
// 获取数据库连接
Connection con = txObject.getConnectionHolder().getConnection();
if (status.isDebug()) {
logger.debug("Rolling back JDBC transaction on Connection [" + con + "]");
}
try {
// 调用数据库的回滚
con.rollback();
}
catch (SQLException ex) {
throw new TransactionSystemException("Could not roll back JDBC transaction", ex);
}
}
5、如果执行过程中,没有任何意外情况的发生,那么通过completeTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法来实现的,实现的时候也是要获取链接,通过连接对象来提交
6、当事务执行完毕之后需要清除相关的事务信息cleanupTransactionInfo