我一直在仔细阅读其他问题中提到的关于事务隔离的postgres文档,但我还没有设法理解"谓词锁定"的东西.
我希望有人能开导我:-)
根据文档:PostgreSQL中的谓词锁与大多数其他数据库系统一样,基于事务实际访问的数据
这听起来不错,那为什么会发生以下情况呢?
CREATE TABLE mycustomer(cid integer PRIMARY KEY, licenses integer);
CREATE TABLE mydevice(id integer PRIMARY KEY, cid integer REFERENCES
mycustomer (cid), status varchar(10));
INSERT INTO mycustomer(cid, licenses) VALUES (1, 5);
INSERT INTO mycustomer(cid, licenses) VALUES (2, 5);
Request 1 Request2
BEGIN TRANSACTION ISOLATION
LEVEL SERIALIZABLE;
BEGIN TRANSACTION ISOLATION
LEVEL SERIALIZABLE;
SELECT * from mydevice where cid = 1;
SELECT * from mydevice where cid = 2;
INSERT INTO mydevice(id, cid, status)
VALUES (1, …Run Code Online (Sandbox Code Playgroud) 有没有办法返回未确认的消息数?
我正在使用此代码来获取队列中的消息数:
DeclareOk declareOk = amqpAdmin.getRabbitTemplate().execute(
new ChannelCallback<DeclareOk>() {
public DeclareOk doInRabbit(Channel channel)
throws Exception {
return channel.queueDeclarePassive(name);
}
});
return declareOk.getMessageCount();
Run Code Online (Sandbox Code Playgroud)
但我想知道未确认消息的数量.
我已经看到RabbitMQ管理工具包含了这些信息(对于每个队列,它给出了Ready/Unacked和Total消息的数量),我想必须有一种从Java/Spring中检索它的方法.
谢谢
UPDATE
Oks,似乎没有办法以编程方式完成,因为配置/队列的列表不是AMPQ的一部分.
可以启用管理插件并查询有关队列的REST Web服务(以及其他内容).更多信息:
据我所知,"testOnBorrow"和"validationQuery"参数正好在我的小巷里,但它们似乎没有按预期工作.
我启动应用程序,运行一些查询,一切都很顺利.然后我重新启动postgres服务器 - 无需重启tomcat - 来测试DataSource可以处理重新连接,我得到的就是:
This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:729)
...
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822)
at org.postgresql.jdbc3.AbstractJdbc3Connection.prepareStatement(AbstractJdbc3Connection.java:273)
at org.postgresql.jdbc2.AbstractJdbc2Connection.prepareStatement(AbstractJdbc2Connection.java:301)
at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:67)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:153)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.TrapException.invoke(TrapException.java:41)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:63)
at $Proxy35.prepareStatement(Unknown …Run Code Online (Sandbox Code Playgroud) 也许有人可以帮我解决Spring(3.1)/ Postgresql(8.4.11)中的事务问题
我的交易服务如下:
@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false)
@Override
public Foo insertObject(Bar bar) {
// these methods are just examples
int x = firstDao.getMaxNumberOfAllowedObjects(bar)
int y = secondDao.getNumerOfExistingObjects(bar)
// comparison
if (x - y > 0){
secondDao.insertNewObject(...)
}
....
}
Run Code Online (Sandbox Code Playgroud)
Spring配置Webapp包含:
@Configuration
@EnableTransactionManagement
public class ....{
@Bean
public DataSource dataSource() {
org.apache.tomcat.jdbc.pool.DataSource ds = new DataSource();
....configuration details
return ds;
}
@Bean
public DataSourceTransactionManager txManager() {
return new DataSourceTransactionManager(dataSource());
}
}
Run Code Online (Sandbox Code Playgroud)
让我们说请求"x"和请求"y"同时执行并且到达注释"比较"(方法insertObject).然后允许它们都插入一个新对象并提交它们的事务.
为什么我没有RollbackException?据我所知,这是Serializable isolotation级别的用途.回到上一个场景,如果x设法插入一个新对象并提交其事务,则不应该允许"y"的事务提交,因为有一个他没有读过的新对象.
也就是说,如果"y"可以再次读取secondDao.getNumerOfExistingObjects(bar)的值,它将意识到有更多的新对象.幻影?
事务配置似乎工作正常:
第一个和第二个DAO如下: …