这两天公司项目动不动就出问题,开始是无法登录,再过一段时间就访问不了了,出现如下情况:
起初以为是代理出现了问题,试着在网上找了下解决办法:
修改httpd.conf,在VirtualHost里加上
-
<VirtualHost *:80>
-
ProxyPass http://192.168.145.111:7001/cd/
-
SetEnv force-proxy-request-1.0.1
-
SetEnv proxy-nokeepalive 1
-
</VirtualHost *:80>
保存,service httpd reload。重新访问不管用。折腾了一番后,查看tomcat log文件,发现数据库发生了死锁,公司用的是postgresql数据库。
后来通过网上通用的方法:
1.检索出死锁进程的ID。
SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID ';
检索出来的字段中,【wating 】字段,数据为t的那条,就是死锁的进程。找到对应的【procpid 】列的值。
2.将进程杀掉。
SELECT pg_cancel_backend('死锁那条数据的procpid值 ');
释放掉锁,能正常访问了,可是跑了一段时间后测试人员又告诉我,登录不了了。郁闷!怎么回事,难道又锁住了??果不其然,由于用户每次登录都会更新用户表的最后一次登录时间,而用户表就是问题的所在。
通过SQL:
select oid,relname from pg_class where relname='t_user';
select locktype,database,pid,relation,mode from pg_locks where relation=1710202
发现用户表形成了AccessShareLock"和"RowExclusiveLock"。怎么释放呢??在网上找了大半圈没找到方法。
后来问了同事才解决了。
解决方案:
打开pgadmin客户端,菜单“工具”->“服务器状态”
选择准备完毕的事务,工具栏,“动作”->“提交事务”。就是这个事务提交失败了,一直卡在那边 所有关于这个事务的表都不能操作,手动提交了下就好了。OK,就是这么简单。
相关推荐
### 浅析PostgreSQL事务处理机制 #### PostgreSQL简介 PostgreSQL是一款开源的对象关系数据库系统,其历史可以追溯至1977年,由Michael Stonebraker领导的加州伯克利分校的INGRES项目发端。它支持大部分SQL标准,...
4. **持久性(Durability)**:一旦事务提交,其对数据库的修改就永久保存,即使系统崩溃也能保持这些更改。 在PostgreSQL中,可以使用以下命令来控制事务: - **BEGIN TRANSACTION** 或 **BEGIN**:开始一个新的...
此外,如果函数依赖的对象(如其他函数或表)在函数执行期间被动态修改,原有的执行规划可能不再适用,导致函数执行失败或性能下降。为了解决这类问题,PostgreSQL提供了几种策略: 1. **函数重建**:通过重新创建...
当客户端提交事务结束(rollback , commit , prepare xact , rollback pxact , commit pxact)的请求后,数据库收到请求,数据库可能执行失败,也可能执行成功,不管怎样都要写对于的WAL日志,还有CLOG,然后数据库...
4. **性能优化**:由于隐式事务管理可能导致频繁的事务提交,这可能对数据库性能产生影响。因此,对于批量操作,可能需要考虑调整数据库的事务隔离级别或使用存储过程来优化性能。 5. **备份与恢复策略**:在使用...
为了实现这一目标,我们可以利用数据库的事务特性,或者采用更高级的分布式事务解决方案,如Saga模式、TCC(Try-Confirm-Cancel)模式、或是基于消息队列的最终一致性方案。每种方法都有其优缺点,需要根据具体业务...
如果事务正常提交,这些记录通常会被清理;但如果事务被回滚,undo log就成为恢复原始数据的关键。 事务的四大特性(ACID)中的原子性(Atomicity)依赖于undo log。原子性确保事务的所有操作要么全部成功,要么...
在Seata的AT(Automatic Two-phase Commit)模式下,当一个分支事务执行时,会先记录undo日志,如果全局事务提交,这些变更会被提交;如果全局事务回滚,undo日志则用于回滚分支事务。 Seata支持多种RPC框架(如...
如果不采用事务管理,一旦其中一个操作失败(如网络中断),将导致数据不一致。使用JDBC事务,可以确保操作的原子性: ```java Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); conn....
序列号一旦分配,即使事务失败也不会被重用,这是为了保持序列号的唯一性和连续性。间断可能由事务回滚或并发访问导致。 #### 40. 什么是OID?什么是CTID? OID是Object Identifier的缩写,是PostgreSQL中对象的...
4. **持久性(Durability)**:一旦事务提交,其结果将是永久的,即使系统崩溃也不会丢失。 在并发数据更新的管理中,有几种常见的策略: 1. **锁定机制**:包括读锁(共享锁)和写锁(排他锁)。读锁允许多个读...
表级锁定适用于全表扫描或批量操作,但可能限制了并发性,因为它们可能导致其他事务等待整个锁定解除。 8. **事务**:事务是一组数据库操作,要么全部成功,要么全部失败。Postgres支持ACID(原子性、一致性、隔离...
7. **事务提交与回滚**:根据SQL语句的执行结果,决定是否提交或回滚事务。如果两个操作都成功,`commit()`方法会提交事务,数据改变永久保存;如果有任何错误,`rollback()`方法会回滚事务,撤销所有更改。 8. **...
我们可以使用`QSqlDatabase::transaction()`开始一个事务,然后执行相关操作,最后用`commit()`提交事务或`rollback()`回滚事务,确保数据的一致性。 总之,QT的SQL模块为开发者提供了强大的数据库操作工具,使得在...
在事务处理过程中遇到错误,可能导致事务无法提交或回滚。 - **-402**:无法打开数据库。连接数据库时遇到错误,可能是由于数据库服务器未运行、网络问题或权限问题导致。 理解这些`sqlcode`返回值,并根据它们...
开发者可以通过开始事务、提交和回滚来确保数据操作的原子性,避免因单个操作失败导致整个事务的不一致状态。 在性能优化方面,"easy_db"提供了缓存机制,对于频繁访问的数据,可以将其缓存起来,减少对数据库的...
- 数据一致性:批量插入可能导致事务边界难以控制,需要确保在发生错误时能正确回滚。 - 错误处理:如果批量操作中的一部分失败,可能需要决定是回滚整个批次还是只回滚失败的部分。 - 内存使用:一次性加载大量数据...
开发者可以开始一个事务,执行一系列操作,然后提交或回滚事务,确保数据的一致性。 7. 批量操作:DbClass可能提供批量插入、更新数据的功能,提升性能,减少多次数据库交互带来的开销。 8. 缓存机制:为了优化...
原子性保证整个交易要么全部成功,要么全部失败,防止部分完成的操作导致数据不一致。一致性确保交易完成后,数据始终处于有效状态。隔离性保证并发操作不会相互干扰,避免出现脏读、不可重复读或幻读的问题。持久性...