资源同步
如果在同一个 DataSource
上同时使用多个事务就需要涉及到 DataSource 资源同步问题。举个简单的例子:
DataSource dataSource = DsUtils.dsMySql();
Connection conn = dataSource.getConnection();
conn.setAutoCommit(false);
JdbcTemplate jdbcTemplate = new JdbcTemplate(conn);
// do something conn
conn.commit();
// do something conn
JdbcTemplate jdbcTemplate = new JdbcTemplate(conn);
conn.commit();
conn.close();
再比如在同一个 DataSource
上开启两个相互独立的事务:
DataSource dataSource = DsUtils.dsMySql();
Connection tranA = dataSource.getConnection();
tranA.setAutoCommit(false);
JdbcTemplate jdbcTemplate = new JdbcTemplate(tranA);
// do something with tranA
Connection tranB = dataSource.getConnection();
tranB.setAutoCommit(false);
JdbcTemplate jdbcTemplate = new JdbcTemplate(tranB);
// do something with tranB
tranB.commit();
tranA.commit();
使用上面这种方式需要在整个调用链上传递 Connection
以确保不同的业务处理逻辑用到相同的数据库连接。
若 Connection
维护不当就会造成链接泄漏,而这种泄漏通常比较难以发现和定位的。