jdbc事务
public void test(){
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "root";
String sql = "update blog set name = ? where id=?";
Connection connection = null;
try {
connection = DriverManager.getConnection(url, username, password);
// 1.关闭自动提交,开启事务
connection.setAutoCommit(false);
PreparedStatement prepareStatement = connection.prepareStatement(sql);
prepareStatement.setString(1, "lucy");
prepareStatement.setInt(2, 1);
prepareStatement.executeUpdate();
// 2.SQL正常执行,提交事务
connection.commit();
} catch (SQLException e) {
try {
// 3.执行出现错误,回滚事务
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
spring事务就是封装这个,
转载大神,spring-xml事务
https://blog.csdn.net/qq_26323323/article/details/81948682
https://blog.csdn.net/qq_26323323/article/details/82017060
boot源码
spring.factories中很多自动配置类,自动配置很多bean
TransactionAutoConfiguration入口配置类
两个bean都配置了EnableTransactionManagement注解
导入了TransactionManagementConfigurationSelector类
debug查看,选择的是PROXY。
导入了两个类AutoProxyRegistrar,ProxyTransactionManagementConfiguration
ProxyTransactionManagementConfiguration配置了3个bean
核心处理类TransactionInterceptor,处理方法
父类TransactionAspectSupport,最核心三步,第一个开启事务,下面是回滚事务,提交事务。else是编程式事务。
第一步,开启事务
TransactionAspectSupport
AbstractPlatformTransactionManager
这里处理传播级别,handleExistingTransaction处理有事务时,但是传播级别要求没有事务时,抛异常或者挂起事务。
// No existing transaction found -> check propagation behavior to find out how to proceed.
注释下面处理,没有事务,但是传播级别要求有事务,创建事务,挂起旧事务。
DataSourceTransactionManager
第二步,回滚事务
TransactionAspectSupport,调用事务管理器的回滚方法
第三步,提交事务
TransactionAspectSupport,调用事务管理器的提交方法