注意: 使用DataSourceUtils.getConnection(dataSource);方式获取连接,而不是dataSource.getConnection()。
dataSource.getConnection()会取到非当前线程的连接导致和当前线程的事务中的连接不相同导致事务不生效的问题。
mybatis插入语句结合connection执行自定义sql插入语句的事务例子:
注意:结合mybatis插入语句事务时,必须保证connection是相同的,通过DataSourceUtils.getConnection(dataSource);来获取当前线程的connection,使用数据源时执行connection后必须要对PreparedStatement和ResultSet进行关闭,不能关闭connection(关闭将会抛出“提交事务时,连接已被关闭”)
下面是java代码 service层
@Autowired
private DataSource dataSource;
@Transactional()
public void aazz() throws Exception {
Connection connection = DataSourceUtils.getConnection(dataSource);
System.out.println("service diy jdbc::::::::::::" + connection.toString());
PreparedStatement preparedStatement = connection.prepareStatement(
"INSERT INTO`hmccgisDB_sit`.`GIS_TASK` (`ID`, `TASK_TITLE`, `TASK_DATA`,`TASK_DATA_REMARK`, `EMAIL`, `TEMPLATE_NAME`, `IS_APPEND`, `SOURCE`) VALUES('4', '5658', '', NULL, '', NULL, '0', '0')");
// 执行自定义sql插入
int a = preparedStatement.executeUpdate();
System.out.println(a);
preparedStatement.close();
PreparedStatement preparedStatement2 = connection.prepareStatement(
"INSERT INTO`hmccgisDB_sit`.`GIS_TASK` (`ID`, `TASK_TITLE`, `TASK_DATA`,`TASK_DATA_REMARK`, `EMAIL`, `TEMPLATE_NAME`, `IS_APPEND`, `SOURCE`) VALUES('5', '5658', '', NULL, '', NULL, '0', '0')");
// 执行自定义sql插入
int b = preparedStatement2.executeUpdate();
System.out.println(b);
preparedStatement2.close();
// connection.close();
// mybatis插入语句
payInfoMapper.aazz();
}