由JDBC事务引起的锁状态以及内存数据无法写入数据库的问题

项目在本地运行正常,但在服务器上出现数据无法写入数据库和事务锁问题。分析发现,关闭数据库连接后,新连接的自动提交仍保持关闭状态,导致后续数据无法写入。解决办法是在finally块中手动开启自动提交,并在catch块中进行事务回滚,以防异常导致的事务锁定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做项目的时候,踩了一个大坑,为了排查BUG所在,花费了大量的时间。所以觉得应该来一个“填坑之路”系列,自己踩过的坑,希望各位看官能及时绕开。得亏看到了,要不然踩着了!

事情是这样的,开发完成的一个项目,在本地测试表现正常,没有问题。但在发布到服务器上之后,问题就出现了,一开始会出现用户添加的数据无法写入数据库的情况,重启数据库之后,一段时间内数据可以及时写入,但一段时间之后又会出现内存中数据无法写入数据库的情况。具体表现为:在Web页面写入数据后,可以在页面看到数据的变化,但进入数据库查询却看不到任何改变。另外,在整个系统访问人数增多之后,会不时地出现事务锁的情况,后台报错为:数据库等待超时或数据库出现死锁。

之后就是分析问题,然后各种猜测:数据库版本不对?数据库配置缓存区设置过大?数据库自动提交默认关闭?数据库引擎问题?数据源连接池采用了单例模式?在排除了以上所有可能之后,我看到了一行代码

conn.setAutoCommit(false);

会不会是这里我要开启事务因而关闭自动提交的原因?但是下面还有一行呢

if (conn != null) {
    conn.close();
}

按理说,我关闭了当前连接,下次建立的又是一个新的连接,数据库又是默认开启自动提交的,所以这样写应该是完全合理的啊。但目前能想到的也只剩这么一个可能了,我不确定是不是这个原因所致,因此我做了一个实验:

从网页上登录系统,首先进行一项需要开启事务的sql语句相关的操作,然后观察数据库是否能及时写入数据,发现写入正常。接下来,无论执行怎样的操作,发现数据库都已经无法及时地写入数据。这下困扰我许久的问题应该水落

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值