【发布时间】:2016-12-13 21:40:42
【问题描述】:
static void clean() throws Exception {
final UserTransaction tx = InitialContext.doLookup("UserTransaction");
tx.begin();
try {
final DataSource ds = InitialContext.doLookup(Databases.ADMIN);
Connection connection1 = ds.getConnection();
Connection connection2 = ds.getConnection();
PreparedStatement st1 = connection1.prepareStatement("XXX delete records XXX"); // delete data
PreparedStatement st2 = connection2.prepareStatement("XXX insert records XXX"); // insert new data that is same primary as deleted data above
st1.executeUpdate();
st1.close();
connection1.close();
st2.executeUpdate();
st2.close();
connection2.close();
tx.commit();
} finally {
if (tx.getStatus() == Status.STATUS_ACTIVE) {
tx.rollback();
}
}
}
我有一个网络应用程序,DAO 以DataSource 作为对象来创建单独的连接来执行数据库操作。
所以我有一个UserTransaction,里面有两个DAO 对象在做单独的动作,第一个是删除,第二个是插入。删除是删除一些记录以允许插入发生,因为插入将插入相同的主键数据。
我取出DAO 层并将逻辑转换为上面的代码。有一点看不懂,根据上面的代码,插入操作应该是失败的,因为代码(UserTransaction里面)取了两个不同的连接,他们不认识,第一个删除没有'显然没有提交,所以第二个语句(插入)应该失败(由于唯一约束),因为两个数据库操作不在同一个连接中,第二个连接无法检测到未提交的更改。但令人惊讶的是,它并没有失败,而且两种语句都可以完美运行。
谁能帮忙解释一下?可以进行任何配置来实现此结果吗?还是我的理解有误?
【问题讨论】:
-
你说你有一个网络应用程序。我想它在某种容器中运行?哪一个?
-
它正在Weblogic服务器中运行。
-
能不能根据这个来看看约束:stackoverflow.com/a/39012274/4823977
标签: database jakarta-ee transactions database-connection commit