在做某些网站的时候,要考虑的关于并发的问题, 比如我在后台多人同时插入数据问题怎么解决,小弟在这个上面有点含糊,理论上数据库加锁就可以实现,这个好象牵扯到事物处理,(备注:要求用jdbc操作数据库)我对这块经验不是很多,具体怎么操作我不清楚,请大家多多指教!!!!!!

解决方案 »

  1.   

    Connection conn = null;
    try{
      conn = ConnDB.getConnection();
      conn.setAutoCommit(false);//设置事务提交 true|false 非事务|事务
      
      //具体数据库操作操作......
      
      conn.commit();
      return true;
    }catch(SQLException e ){    //操作不成功
      try {
        conn.rollback();        //回滚
      } catch (SQLException e1) {  }
      return false;
    }finally{
      try{
        conn.close();           //关闭数据库
      }catch(SQLException ee){
      }
    }
      

  2.   

    insert/update/delete的操作,数据库自己会锁表的。
    select for update也会锁表。事务要自己控制。楼上的例子即可。
      

  3.   

    Oracle的锁很多而且很复杂,例如select ... for update;就是一种锁表的操作,Oracle默认的事物隔离级别是read-commited,也就是说使用Oracle处理数据时默认情况下会出现non-repeatable read(不可重复读)、幻读这两个问题,而Mysql默认的事物隔离级别是repeatable read,也就是说使用Mysql处理数据时默认情况下只会出现幻读问题(其时很少考虑幻读),如果完全不考虑效率为了保证数据安全,各种数据库都可以手动设置隔离级别的,你把它设为最高级serializable,什么问题都不会出现,如果为了兼顾效率和安全,最好是设置成Oracle的read-commited这个级别,然后可以通过悲观锁或者是乐观锁来解决non-repeatable read问题(不能解决幻读问题,但是它很少考虑)...
      

  4.   

    一旦有用户在写数据库的表时,Oracle就会自动的锁住那张表,而当其他用户来操作这张表的时候,就只有可读性了。直到那个用户对这张表的操作完毕,另一个用户才能写它。
      

  5.   

    再同一张表上进行DML(insert\update\delete)操作,oracle数据库会自动给表加锁,只有当这个操作结束后,锁才能释放,在等待队列中的下一个线程才会执行下一个DML语句。所以不同事物中的数据库并发操作不需要你进行控制。
      

  6.   

        如果当数据库要操作一个表、或一个表的具体数据时,为了防止不此数据不被其它操作在同一时间(MS级的)访问而引起冲突,数据库本身会有一套保护机制,这个是由开发数据库系统的专业人员做的(如Oracle、SQLSERVER他们公司的人),而我们应用数据库的人不需要关心,只了解原理即可。具体原理像访问文件一样,一个文件正在被一个进程/线程访问时,就不能被另一个进程/线程修改,这是由操作系统的的文件管理功能实现的。而这在OS或DMS内部都由一些算法实现,这些算法有的是公开的,有的是不公开的。
        如果LZ学习下SVN的原理,可能更熟悉了。