求教 各位大侠!!!!! 在做某些网站的时候,要考虑的关于并发的问题, 比如我在后台多人同时插入数据问题怎么解决,小弟在这个上面有点含糊,理论上数据库加锁就可以实现,这个好象牵扯到事物处理,(备注:要求用jdbc操作数据库)我对这块经验不是很多,具体怎么操作我不清楚,请大家多多指教!!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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){ }} insert/update/delete的操作,数据库自己会锁表的。select for update也会锁表。事务要自己控制。楼上的例子即可。 Oracle的锁很多而且很复杂,例如select ... for update;就是一种锁表的操作,Oracle默认的事物隔离级别是read-commited,也就是说使用Oracle处理数据时默认情况下会出现non-repeatable read(不可重复读)、幻读这两个问题,而Mysql默认的事物隔离级别是repeatable read,也就是说使用Mysql处理数据时默认情况下只会出现幻读问题(其时很少考虑幻读),如果完全不考虑效率为了保证数据安全,各种数据库都可以手动设置隔离级别的,你把它设为最高级serializable,什么问题都不会出现,如果为了兼顾效率和安全,最好是设置成Oracle的read-commited这个级别,然后可以通过悲观锁或者是乐观锁来解决non-repeatable read问题(不能解决幻读问题,但是它很少考虑)... 一旦有用户在写数据库的表时,Oracle就会自动的锁住那张表,而当其他用户来操作这张表的时候,就只有可读性了。直到那个用户对这张表的操作完毕,另一个用户才能写它。 再同一张表上进行DML(insert\update\delete)操作,oracle数据库会自动给表加锁,只有当这个操作结束后,锁才能释放,在等待队列中的下一个线程才会执行下一个DML语句。所以不同事物中的数据库并发操作不需要你进行控制。 如果当数据库要操作一个表、或一个表的具体数据时,为了防止不此数据不被其它操作在同一时间(MS级的)访问而引起冲突,数据库本身会有一套保护机制,这个是由开发数据库系统的专业人员做的(如Oracle、SQLSERVER他们公司的人),而我们应用数据库的人不需要关心,只了解原理即可。具体原理像访问文件一样,一个文件正在被一个进程/线程访问时,就不能被另一个进程/线程修改,这是由操作系统的的文件管理功能实现的。而这在OS或DMS内部都由一些算法实现,这些算法有的是公开的,有的是不公开的。 如果LZ学习下SVN的原理,可能更熟悉了。 Open Flash Chart 区别 中文乱码,永恒的主题! loadrunner hibernate+mysql乱码 批量更新的效率问题 我想问一下各位大侠薪水都是多少呀? 各位大哥帮帮忙,为什么Struts的资源文件老是找不到! 我做程序员的一点感想! mybatis的一级缓存会不会产生脏数据问题? 关于一个http头属性设置的问题 hibernate search搜索结果的问题
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){
}
}
select for update也会锁表。事务要自己控制。楼上的例子即可。
如果LZ学习下SVN的原理,可能更熟悉了。