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

解决方案 »

  1.   

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

  2.   

    如果登录不做什么修改数据, 只是读取数据应该不会那么卡吧. 卡死之后mysql java端应该有一定的异常提示, 类似timeout, dead lock。可以使用悲观锁, select ..  where index =xx for update, 确保查询更新之后释放各种资源. 或者使用乐观锁, 加个数据版本做标记. 
      

  3.   

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

  4.   


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

  5.   

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

  6.   

    建议你到网上搜索一下mysql事务的机制我对mysql了解不多。http://blog.csdn.net/forever_feng/archive/2009/07/21/4368003.aspx你可以看一下这个文章,看看根据里面提到的,修改一下相关的参数能否减少死锁的次数。或者搜索一下,mysql事务中死锁的自动放锁机制。因为之前听说过oracle中死锁,可以修改某些参数,让事务的一方自动放锁。不过一直也没用过。不知道mysql有没有这种机制。