Spring事务的原理
Spring事务的本质其实就是数据库Innodb对事务的支持,没有innodb是事务支持,spring是无法提供事务支持的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
对于纯jdbc操作数据库,想要用到事务,需要按照以下的步骤进行:
- 获取连接
Connection connection = DriverManager.getConnection(url, username, root);
- 开启事务
connection .setAutoCommit(true/false);
- 执行CRUD
- 提交事务/回滚事务
connection .commit() / connection .rollback();
- 关闭连接
connection .close();
代码如下
try {
Connection connection = DriverManager.getConnection(url, username, root);
connection .setAutoCommit(false); //开启事务,禁止自动提交
preparedStatement = conn.prepareStatement("update t_category t set t.name='测试' where t.id =?");
preparedStatement.setInt(1, 10);
preparedStatement.executeUpdate() ;
connection .commit(); //提交事务
}catch(Exception e ){
connection .rollback();
}
使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。
Spring的事务机制
Spring的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现,如表所示:
数据访问技术 |
实现 |
---|---|
JDBC |
DataSourceTransactionManager |
JPA |
JapTransactionManager |
Hibernate |
HibernateTransactionManager |
JDO |
HibernateTransactionManager |
分布式事务 |
JtaTransactionManager |
以上参考出处:https://my.oschina.net/xiaolyuh/blog/3109049
以JDBC为例,可以在代码配置事务管理器:
@Beanpublic PlatformTransactionManager transactionManager() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(druidDataSource());
return transactionManager;
}