对演示代码有疑问
来源:2-3 事务原则与实现:JDBC事务(上)

目科将
2018-08-09
simulaterERROR(); 程序没有try catch ,方法应该直接抛异常了,不应该还能执行 connection.close();
我理解数据库数据没有变的原因是这个事务还没有提交,请教下老师我这样理解对吗
写回答
1回答
-
大漠风
2018-08-10
connection.close()的调用情况有些复杂。
一般情况下,我们使用jdbc driver的库,都用的是带连接池功能的,例如现在用的很多的阿里的那个。你的业务方法请求DAO层访问数据库的时候,会从连接池里获得一个链接并使用。那么这个连接的状态就会由这个库为我们维护。比如说拿到一个连接的时候,它是一个“干净”的,也就是没有之前的事务,也没有未提交的操作等。当使用完的时候,这个库也会做一些清理的操作。
然后,这些库维护connection的状态,一般也是通过spring的事物机制来协助完成。比如我们的业务方法在一个事务里,然后在业务方法里出现异常的时候,spring会设置当前的事务的状态为回滚,然后在之后把这个数据库的connection放回连接池的时候,也做相应的回滚操作。
然后,spring的事务机制的具体管理过程,也根据具体的实现类型会不一样,比如使用JPATransactionManager和DataSourceTransactionManager等。但是基本的管理思想都差不多。
00
相似问题