spring事务与数据库事务之间的关系
- spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁
- spring事务是对数据库事务的封装,最后本质的实现还是在数据库,如果数据库不支持事务,spring的事务是不起作用的。数据库的事务简单来说,只有开启、回滚和关闭
- spring对数据库事务的包装,原理上就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启、回滚或关闭操作。但是spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理
- spring事务实际使用AOP拦截注解方法,然后使用动态代理处理事务方法,捕获处理过程中的异常,spring事务其实是把异常交给spring处理
- spring事务只有捕获到异常才会终止或回滚,如果在程序中try/catch后自己处理异常而没有throw,那么事务将不会终止或回滚,失去事务本来的作用
- spring事务会捕获所有的异常,但只会回滚数据库相关的操作,并且只有在声明了rollbackForClassName="Exception"之类的配置才会回滚
- spring事务会回滚同一事务中的所有数据库操作,本质上是回滚同一数据库连接上的数据库操作
事务的隔离级别与锁有什么关系
事务的隔离级别是通过锁的机制实现的,事务的隔离级别是数据库开发商根据业务逻辑的实际需要定义的一组锁的使用策略。当我们将数据库的隔离级别定义为某一级别后如仍不能满足要求,我们可以自定义 sql 的锁来覆盖事务隔离级别默认的锁机制。
总结:
1、spring事务总结
- spring事务本质上使用数据库锁
- spring事务只有在方法执行过程中出现异常才会回滚,并且只回滚数据库相关的操作
2、 对象锁和spring事务的对比
- 对象锁可以保证数据一致性和业务逻辑正确性,但不能保证并发性
- spring事务不能严格保证数据一致性和业务逻辑正确性,但具有较好的并发性,因为只锁数据库行数据
spring事务为什么不能保证数据一致性和业务逻辑正确性
- 如果事务方法抛异常,此时会回滚数据库操作,但已经执行的其他方法不会回滚,因此无法保证业务逻辑正确性
- 即使事务方法不抛异常,也不能保证数据一致性(因为事务接口里的数据库操作在整个接口逻辑执行结束后才提交到数据
库,在接口最后提交到数据库的前后很有可能带来数据一致性的问题),从而不能保证业务逻辑正确性
参考博文:https://blog.youkuaiyun.com/qq_31854907/article/details/87627067