大家来讨论一下:两个项目同时访问一个数据库的问题

时间:2022-02-21 03:38:50
有两个项目,一个是C++写的,一个是Java写的,使用同一个数据库(MySql)
在两个程序同时运行时,会出现登陆卡死现象。请讨论原因,并根据原因讨论可行的解决办法

24 个解决方案

#1


内存不够

#2


那是数据库的事情了吧。

#3


数据库连接数怎么设置的? 卡死一般是连接数占满了

两边分配自己合理的连接数 在访问完数据库后释放掉连接

#4


应该是发生数据库死锁了
比如C++的事务要修改某条记录,java中的事务修改了该记录还没提交,同时java的事务需要修改某另一条记录,C++事务正好也修改了该某另一条记录还没提交,此时就双方就会等待对方的事务提交,但因为双方都在等待对方,所以双发都没法进行到最后而提交,于是就死锁了。

#5


应该是数据库死锁吧

这个问题就把两个登录的代码好好查一下,看事务里的处理顺序。

#6


引用 4 楼 qybao 的回复:
应该是发生数据库死锁了
比如C++的事务要修改某条记录,java中的事务修改了该记录还没提交,同时java的事务需要修改某另一条记录,C++事务正好也修改了该某另一条记录还没提交,此时就双方就会等待对方的事务提交,但因为双方都在等待对方,所以双发都没法进行到最后而提交,于是就死锁了。

+1.
100%是死锁

#7


那要是两个系统同时用一个账号登陆呢,在一起操作数据怎么办?

#8


引用 7 楼 leehomwong 的回复:
那要是两个系统同时用一个账号登陆呢,在一起操作数据怎么办?

感觉这两个项目应该是一个前台一个后台吧,估计不应该是同样的系统。

#9


如果登录不做什么修改数据, 只是读取数据应该不会那么卡吧. 

卡死之后mysql java端应该有一定的异常提示, 类似timeout, dead lock。

可以使用悲观锁, select ..  where index =xx for update, 确保查询更新之后释放各种资源. 

或者使用乐观锁, 加个数据版本做标记. 

#10


两个项目同时运行不是说同时登陆,而且登陆的数据也不相同。出错的时候往往是这样的:C++ 的项目正在测试,然后这时我访问了java做的Web端,然后有可能就出现登陆卡死现象。

#11


上面很多仁兄说应该是 数据库死锁的原因,那么应该如何解决,静待各位仁兄佳音

#12


发生情况有很多~

#13


弄两个数据库,同步过去。。?

#14


我觉得可能是对数据执行了操作,但是事务不是自动提交的的,因为事务没有提交,记录就一直锁住了,因为你的问题出现,基本是必现得了,所以出现的问题可能在这里。

#15


那如果一个正在操作另一个访问怎么办

#16


引用 9 楼 zealvampire 的回复:
如果登录不做什么修改数据, 只是读取数据应该不会那么卡吧. 

卡死之后mysql java端应该有一定的异常提示, 类似timeout, dead lock。

可以使用悲观锁, select .. where index =xx for update, 确保查询更新之后释放各种资源. 

或者使用乐观锁, 加个数据版本做标记.


我觉得悲观锁更好些,乐观锁在这个场景下不适合。

#17


两个项目一起用同一个数据库在读的时候出问题是内存硬件的问题.
如果是在写的时候出现卡死的情况那就是数据库的策略问题,死锁~

#18


引用 11 楼 newlife_bj 的回复:
上面很多仁兄说应该是数据库死锁的原因,那么应该如何解决,静待各位仁兄佳音


1、尽量晚的开启一个事务
2、事务里的代码要尽量简洁,把一些不必要放在事务中的代码移到事务外面去
3、调整C++和java代码中事务部分对表的处理顺序,不要C++先锁定A表再锁定B表,而java先锁定B表再锁定A表。这样在并发量大的时候,两个事务必死无疑。应该是都按照一个顺序锁定相关的表。


祝你成功

#19


其实到现在我都不知道问题的原因呢……此种问题是客户那边出现的,我基本上很少遇到……

#20


引用 17 楼 hpjianhua 的回复:
两个项目一起用同一个数据库在读的时候出问题是内存硬件的问题.
如果是在写的时候出现卡死的情况那就是数据库的策略问题,死锁~

针对两种问题我怎么做才能比较快速比较好的解决呢?

#21


引用 18 楼 yuanjianbin 的回复:
引用 11 楼 newlife_bj 的回复:

上面很多仁兄说应该是数据库死锁的原因,那么应该如何解决,静待各位仁兄佳音


1、尽量晚的开启一个事务
2、事务里的代码要尽量简洁,把一些不必要放在事务中的代码移到事务外面去
3、调整C++和java代码中事务部分对表的处理顺序,不要C++先锁定A表再锁定B表,而java先锁定B表再锁定A表。这样在并发量大的时候,两个事务必死无疑。应……

这样岂不是两个项目中的代码都需要改?而且还得对各种逻辑一一排查?想一想很恐怖……而且我只是做java的,现在那位C++的工程师已经忙的焦头烂额了,根本没法和我进行配合啊

#22


建议你到网上搜索一下mysql事务的机制

我对mysql了解不多。

http://blog.csdn.net/forever_feng/archive/2009/07/21/4368003.aspx

你可以看一下这个文章,看看根据里面提到的,修改一下相关的参数能否减少死锁的次数。

或者搜索一下,mysql事务中死锁的自动放锁机制。

因为之前听说过oracle中死锁,可以修改某些参数,让事务的一方自动放锁。不过一直也没用过。不知道mysql有没有这种机制。

#23


引用 22 楼 yuanjianbin 的回复:
建议你到网上搜索一下mysql事务的机制

我对mysql了解不多。

http://blog.csdn.net/forever_feng/archive/2009/07/21/4368003.aspx

你可以看一下这个文章,看看根据里面提到的,修改一下相关的参数能否减少死锁的次数。

或者搜索一下,mysql事务中死锁的自动放锁机制。


因为之前听说过oracle中死锁,可……

非常感谢,我这就去试一下

#24


如果新的解决观点,望各位不吝赐教

#1


内存不够

#2


那是数据库的事情了吧。

#3


数据库连接数怎么设置的? 卡死一般是连接数占满了

两边分配自己合理的连接数 在访问完数据库后释放掉连接

#4


应该是发生数据库死锁了
比如C++的事务要修改某条记录,java中的事务修改了该记录还没提交,同时java的事务需要修改某另一条记录,C++事务正好也修改了该某另一条记录还没提交,此时就双方就会等待对方的事务提交,但因为双方都在等待对方,所以双发都没法进行到最后而提交,于是就死锁了。

#5


应该是数据库死锁吧

这个问题就把两个登录的代码好好查一下,看事务里的处理顺序。

#6


引用 4 楼 qybao 的回复:
应该是发生数据库死锁了
比如C++的事务要修改某条记录,java中的事务修改了该记录还没提交,同时java的事务需要修改某另一条记录,C++事务正好也修改了该某另一条记录还没提交,此时就双方就会等待对方的事务提交,但因为双方都在等待对方,所以双发都没法进行到最后而提交,于是就死锁了。

+1.
100%是死锁

#7


那要是两个系统同时用一个账号登陆呢,在一起操作数据怎么办?

#8


引用 7 楼 leehomwong 的回复:
那要是两个系统同时用一个账号登陆呢,在一起操作数据怎么办?

感觉这两个项目应该是一个前台一个后台吧,估计不应该是同样的系统。

#9


如果登录不做什么修改数据, 只是读取数据应该不会那么卡吧. 

卡死之后mysql java端应该有一定的异常提示, 类似timeout, dead lock。

可以使用悲观锁, select ..  where index =xx for update, 确保查询更新之后释放各种资源. 

或者使用乐观锁, 加个数据版本做标记. 

#10


两个项目同时运行不是说同时登陆,而且登陆的数据也不相同。出错的时候往往是这样的:C++ 的项目正在测试,然后这时我访问了java做的Web端,然后有可能就出现登陆卡死现象。

#11


上面很多仁兄说应该是 数据库死锁的原因,那么应该如何解决,静待各位仁兄佳音

#12


发生情况有很多~

#13


弄两个数据库,同步过去。。?

#14


我觉得可能是对数据执行了操作,但是事务不是自动提交的的,因为事务没有提交,记录就一直锁住了,因为你的问题出现,基本是必现得了,所以出现的问题可能在这里。

#15


那如果一个正在操作另一个访问怎么办

#16


引用 9 楼 zealvampire 的回复:
如果登录不做什么修改数据, 只是读取数据应该不会那么卡吧. 

卡死之后mysql java端应该有一定的异常提示, 类似timeout, dead lock。

可以使用悲观锁, select .. where index =xx for update, 确保查询更新之后释放各种资源. 

或者使用乐观锁, 加个数据版本做标记.


我觉得悲观锁更好些,乐观锁在这个场景下不适合。

#17


两个项目一起用同一个数据库在读的时候出问题是内存硬件的问题.
如果是在写的时候出现卡死的情况那就是数据库的策略问题,死锁~

#18


引用 11 楼 newlife_bj 的回复:
上面很多仁兄说应该是数据库死锁的原因,那么应该如何解决,静待各位仁兄佳音


1、尽量晚的开启一个事务
2、事务里的代码要尽量简洁,把一些不必要放在事务中的代码移到事务外面去
3、调整C++和java代码中事务部分对表的处理顺序,不要C++先锁定A表再锁定B表,而java先锁定B表再锁定A表。这样在并发量大的时候,两个事务必死无疑。应该是都按照一个顺序锁定相关的表。


祝你成功

#19


其实到现在我都不知道问题的原因呢……此种问题是客户那边出现的,我基本上很少遇到……

#20


引用 17 楼 hpjianhua 的回复:
两个项目一起用同一个数据库在读的时候出问题是内存硬件的问题.
如果是在写的时候出现卡死的情况那就是数据库的策略问题,死锁~

针对两种问题我怎么做才能比较快速比较好的解决呢?

#21


引用 18 楼 yuanjianbin 的回复:
引用 11 楼 newlife_bj 的回复:

上面很多仁兄说应该是数据库死锁的原因,那么应该如何解决,静待各位仁兄佳音


1、尽量晚的开启一个事务
2、事务里的代码要尽量简洁,把一些不必要放在事务中的代码移到事务外面去
3、调整C++和java代码中事务部分对表的处理顺序,不要C++先锁定A表再锁定B表,而java先锁定B表再锁定A表。这样在并发量大的时候,两个事务必死无疑。应……

这样岂不是两个项目中的代码都需要改?而且还得对各种逻辑一一排查?想一想很恐怖……而且我只是做java的,现在那位C++的工程师已经忙的焦头烂额了,根本没法和我进行配合啊

#22


建议你到网上搜索一下mysql事务的机制

我对mysql了解不多。

http://blog.csdn.net/forever_feng/archive/2009/07/21/4368003.aspx

你可以看一下这个文章,看看根据里面提到的,修改一下相关的参数能否减少死锁的次数。

或者搜索一下,mysql事务中死锁的自动放锁机制。

因为之前听说过oracle中死锁,可以修改某些参数,让事务的一方自动放锁。不过一直也没用过。不知道mysql有没有这种机制。

#23


引用 22 楼 yuanjianbin 的回复:
建议你到网上搜索一下mysql事务的机制

我对mysql了解不多。

http://blog.csdn.net/forever_feng/archive/2009/07/21/4368003.aspx

你可以看一下这个文章,看看根据里面提到的,修改一下相关的参数能否减少死锁的次数。

或者搜索一下,mysql事务中死锁的自动放锁机制。


因为之前听说过oracle中死锁,可……

非常感谢,我这就去试一下

#24


如果新的解决观点,望各位不吝赐教