我创建了一个ConnectionCustomizer
,其autoCommit
设置为false
,隔离级别设置为TRANSACTION_REPEATABLE_READ
中的onCheckOut()
当我在psotgresql数据库上执行CRUD操作然后提交时,事务没有提交,我可以在pg_log中看到回滚(见下)。
我已经读过c3p0默认行为是在连接返回池时回滚任何未提交的事务。我怎样才能真正提交我的交易?
我已将此示例代码编写到要测试的资源中:
@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public Response test(@QueryParam("userId") long userId,
@HeaderParam("Accept-Language") String acceptLanguage) throws NamingException, SQLException {
InitialContext context = new InitialContext();
ComboPooledDataSource dataSource = (ComboPooledDataSource) context.lookup("jdbc/mydb");
SimpleJdbcInsert insertTest = new SimpleJdbcInsert(dataSource)
.withTableName("chat")
.usingGeneratedKeyColumns("idchat");
//BEGIN transaction
dataSource.getConnection().commit();
Map<String, Object> parameters = new HashMap<String, Object>(2);
parameters.put("idcompte", userId);
parameters.put("idvendeur", 148);
parameters.put("idannonce", 282);
parameters.put("creationdate", new Timestamp(Calendar.getInstance()
.getTime().getTime()));
parameters.put("lastmodified", new Timestamp(Calendar.getInstance()
.getTime().getTime()));
Map<String, Object> m = new HashMap<String, Object>();
m.put("idchat", insertTest.executeAndReturnKey(parameters));
//Commit transaction
dataSource.getConnection().commit();
return Response.ok(m, MediaType.APPLICATION_JSON).build();
}
此资源返回自动生成的值:
{
idchat: 101
}
但是当我查看表格时,没有插入行,pg_log显示了这一点:
LOG: durée : 0.019 ms, analyse <unnamed> : SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ
LOG: durée : 0.005 ms, lien <unnamed> : SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ
LOG: durée : 0.006 ms exécute <unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ
LOG: durée : 0.014 ms, lien S_1 : BEGIN
LOG: durée : 0.004 ms exécute S_1: BEGIN
LOG: durée : 0.222 ms, analyse <unnamed> : INSERT INTO chat (idannonce, idcompte, idvendeur, creationdate, lastmodified) VALUES($1, $2, $3, $4, $5) RETURNING "idchat"
LOG: durée : 0.075 ms, lien <unnamed> : INSERT INTO chat (idannonce, idcompte, idvendeur, creationdate, lastmodified) VALUES($1, $2, $3, $4, $5) RETURNING "idchat"
DÉTAIL: paramètres : $1 = '282', $2 = '226', $3 = '148', $4 = '2013-07-04 14:57:07.466', $5 = '2013-07-04 14:57:07.466'
LOG: durée : 1.027 ms exécute <unnamed>: INSERT INTO chat (idannonce, idcompte, idvendeur, creationdate, lastmodified) VALUES($1, $2, $3, $4, $5) RETURNING "idchat"
DÉTAIL: paramètres : $1 = '282', $2 = '226', $3 = '148', $4 = '2013-07-04 14:57:07.466', $5 = '2013-07-04 14:57:07.466'
LOG: durée : 0.012 ms, lien S_2 : ROLLBACK
LOG: durée : 0.030 ms exécute S_2: ROLLBACK
LOG: durée : 0.025 ms, analyse <unnamed> : SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ
LOG: durée : 0.004 ms, lien <unnamed> : SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ
LOG: durée : 0.006 ms exécute <unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ
答案 0 :(得分:1)
您正在从DataSource获取新连接并在其上调用commit()。这没用,因为你没有对新连接做过任何工作。 JDBC事务的范围是每个连接。您需要对已执行插入的Connection执行commit(),对insertTest
对象中的某些内容的访问权限。
(编辑,一个名为SimpleJdbcInsert
的类可能不是一个好主意.JDBC插入非常简单。如果你只是在这里完成工作,或者把它移交给你的代码会更清洁接受连接的辅助功能。如果您正在处理数据源,则SimpleJdbcInsert
必须负责所有获取连接,提交或回滚任何事务工作,以及关闭()连接。如果该对象无法关闭()连接,你有一个连接泄漏并将耗尽池。如果它关闭()连接没有提交,你不应该感到震惊,你的工作被回滚。)