一:Spring事物是什么?
spring事务的本质是底层数据库对事务的支持,spring并不直接管理事物,而是提供了多种事务管理器,具体的实现由持久化框架自己来做。
二:Spring为什么需要事物?
add方法,功能是向数据库添加数据的操作,其中部分代码有问题,正常情况下不能向数据库成功插入数据,如果没有事物管理,会成功插入数据,如果有事物管理,不会成功插入数据
@Repository("userDao02")
public class UserDao {@Autowired
private JdbcTemplate jdbcTemplate;public void add(String name, String age) {String sql = "INSERT INTO caogang(NAME, age) VALUES(?,?);";int update = jdbcTemplate.update(sql, name, age);System.out.println("数据库添加user成功..insert:" + update);
}public void add() {System.out.println("userDao002 add....");}
}public void add() {System.out.println("添加用户开始...");userDao.add("ceshi","30");int j=1/0;
}
三:Spring事务做了什么?
jdbc来操作数据库,必须通过以下步骤才能使用到数据库的事务,步骤如下:
- 获取连接 Connection con = DriverManager.getConnection()
- 开启事务con.setAutoCommit(true/false);
- 执行CRUD
- 提交事务/回滚事务 con.commit() / con.rollback();
- 关闭连接 conn.close();
Spring的事务管理会自动帮我们完成上面的2和4的步骤,不再需要我们自己去手动开启和关闭
四:Spring中如何开启事务?
Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种。
编程式事务:开发者在代码中手动的管理事务的开启、提交、回滚等操作。
@Component
public class TransactionUtils {@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;//开启事物(参数是事物的隔离级别)public TransactionStatus begin(){TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionDefinition());System.out.println("开启事物");return transaction;}//提交事物public void commit(TransactionStatus transaction){dataSourceTransactionManager.commit(transaction);System.out.println("提交事物");}//回滚事物public void rollback(TransactionStatus transaction){dataSourceTransactionManager.rollback(transaction);System.out.println("回滚事物");}
}public void add() {TransactionStatus begin = null;try {begin = transactionUtils.begin();userDao.add("caogang2", "20");int i=1/0;transactionUtils.commit(begin);} catch (Exception e) {e.printStackTrace();transactionUtils.rollback(begin);}
}
如果很多方法都需要事物,自己在每个方法都去开启,提交,回滚,无意义的工作量很大,此时用aop的思想来解决,就会减少很多工作量
声明式事务