数据库——表被锁死

症状:在系统的页面上做修改时点击提交没有反应,当在程序中debug的时候,使用f8执行到发sql语句的地方断点就会消失了,但是程序没有执行结束。经过仔细检查代码之后发现代码书写没有问题,就将mapper中的update语句放到数据库中执行。语句会一直处于执行中状态。

原因:表被锁死了。

导致表锁死的原因:

1.当执行insert、update、delete的程序在未执行结束时,强行将程序终止。此时对数据库的操作还没有进行commit,之后再进行insert、update、delete的时候就会出现sql一直处于执行的状态,此时会发生资源正忙的异常就是锁表。

2.锁表发生于并发而不是并行。并行:一个线程操作数据库时,另一个线程是不能操作数据库的。

锁表的原理:数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,知道发生commit或者回滚或者退出数据库用户。

解决方案:杀死锁表进程

通过以下语句查询锁表的进程,发现确实update的表被锁死了。

select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;

杀死锁表进程:

alter system kill session 'sid,serial#';

 

### 如何正确释放数据库中的 在关系型数据库中,是一种用于管理并发事务的重要机制。无论是悲观还是乐观,都需要有明确的方式来进行的管理和释放。以下是关于如何正确释放数据库的相关说明: #### 1. **自动释放** 大多数现代数据库系统支持事务级别的管理。当一个事务结束时(无论是提交 `COMMIT` 或回滚 `ROLLBACK`),由该事务持有的所有都会被自动释放[^1]。 ```sql -- 提交事务并释放 COMMIT; -- 回滚事务并释放 ROLLBACK; ``` 这种方式是最常见也是最推荐的方法,因为它减少了手动干预的可能性,从而降低了错误风险。 --- #### 2. **显式解** 某些场景下可能需要显式的解操作。例如,在 MySQL 的 InnoDB 存储引擎中,可以通过执行以下命令来解除特定类型的: - 使用 `UNLOCK TABLES;` 来释放[^2]。 ```sql UNLOCK TABLES; ``` 需要注意的是,只有当前会话持有的情况下才可以成功执行上述命令;否则可能会报错或无任何效果。 对于行级或其他更细粒度的,则通常依赖于事务生命周期结束后自然释放,而不允许直接通过 SQL 显式解除单个行上的。 --- #### 3. **终止阻塞进程** 如果某个长时间运行或者异常挂起的任务导致资源持续占用而未能正常释放其拥有的,可以考虑强制杀死对应的连接/线程以解决问题。具体做法如下所示: - 查找正在等待的查询及其关联的信息: ```sql SELECT * FROM information_schema.INNODB_LOCK_WAITS; ``` - 获取目标 session id 后停止指定 ID 所属客户端活动: ```sql KILL CONNECTION connection_id; ``` 这种方法应谨慎使用,因为强行中断可能导致未保存更改丢失甚至引发新的不一致状况发生。 --- #### 4. **优化设计减少不必要的定时间** 除了以上技术手段外,还可以从应用层面入手改进程序逻辑结构,尽量缩短加期间长度,降低死概率的同时也间接促进了更快地完成清理工作流程。比如采用短活期事务模型、合理调整隔离级别等措施均有助于提高整体效率现[^3]。 另外值得注意的一点在于选择适合业务特性的策略也很重要——像前面提到过的那样,相比于传统的悲观方式来说,有时候运用更为灵活高效的乐观控制方法也许能够带来更好的用户体验以及更低廉的成本支出[^4]。 --- ### 总结 综上所述,要确保数据库内的各种形式的约束都能得到妥善处置,既可以从基础架构方面着手改善硬件条件配置参数设定等方面出发寻找突破口,也可以深入挖掘软件编码环节存在的潜在隐患加以修正完善。最终目的是达成最佳平衡点使得整个生态系统既能满足高性能运转的要求又能保障数据安全可靠不受损害。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值