c3p0回滚事务而不是提交

时间:2013-07-04 13:04:05

标签: web-services postgresql jetty commit c3p0

我创建了一个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

1 个答案:

答案 0 :(得分:1)

您正在从DataSource获取新连接并在其上调用commit()。这没用,因为你没有对新连接做过任何工作。 JDBC事务的范围是每个连接。您需要对已执行插入的Connection执行commit(),对insertTest对象中的某些内容的访问权限。

(编辑,一个名为SimpleJdbcInsert的类可能不是一个好主意.JDBC插入非常简单。如果你只是在这里完成工作,或者把它移交给你的代码会更清洁接受连接的辅助功能。如果您正在处理数据源,则SimpleJdbcInsert必须负责所有获取连接,提交或回滚任何事务工作,以及关闭()连接。如果该对象无法关闭()连接,你有一个连接泄漏并将耗尽池。如果它关闭()连接没有提交,你不应该感到震惊,你的工作被回滚。)