【问题标题】:c3p0 rollbacks transaction instead of committingc3p0 回滚事务而不是提交
【发布时间】:2013-07-02 12:06:49
【问题描述】:

我创建了一个ConnectionCustomizer,将autoCommit 设置为false,并将onCheckOut() 中的隔离级别设置为TRANSACTION_REPEATABLE_READ

当我在我的 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

【问题讨论】:

    标签: web-services postgresql jetty commit c3p0


    【解决方案1】:

    您正在从 DataSource 获取一个新的 Connection 并在其上调用 commit()。那没用,因为您没有在新的 Connection 上做任何工作。 JDBC 事务的范围是每个连接。您需要在执行插入的 Connection 上执行 commit(),对它的访问隐藏在您的 insertTest 对象中的某处。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2013-11-20
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多