最近做底层遇到了很多坑,记录如下(有些内容来自网络,标记):
注意: 使用DataSourceUtils.getConnection(dataSource);方式获取连接,而不是dataSource.getConnection()。
dataSource.getConnection()会取到非当前线程的连接导致和当前线程的事务中的连接不相同导致事务不生效的问题。
mybatis插入语句结合connection执行自定义sql插入语句的事务例子:
注意:结合mybatis插入语句事务时,必须保证connection是相同的,通过DataSourceUtils.getConnection(dataSource);来获取当前线程的connection,使用数据源时执行connection后必须要对PreparedStatement和ResultSet进行关闭,不能关闭connection(关闭将会抛出“提交事务时,连接已被关闭”)
另外记得设置空闲测试链接,不然连接池不知道数据库已经释放,还会以为保持链接,会报错!