关于并发的问题:乐观锁和悲观锁
1.乐观锁是在代码层做校验通常使用版本号对比的方式,或者使用时间戳(hibernate自带实现通过annotation:@version)
数据库中保存version整数,每次修改的时候获取版本号然后version+1,提交之前获取库里面的version同时
对库里面的version+1和提交的version值对比如果不相等说明被其他线程修改过,返回错误,如果相等更新数据
2.悲观锁是对数据库的数据进行加锁操作,影响性能
注:
sqlserver采用页级锁:采用串行方式等候上一个操作完成以后才进行下一个操作,并发插入影响效率
oracle采用行级锁:只锁定访问的那一行的数据,并发插入不会有影响
mysql不同的引擎支持不同的锁:
页级:引擎 BDB
表级:引擎 MyISAM ,理解为锁住整个表,可以同时读,写不行
行级:引擎 INNODB , 单独的一行记录加锁
√: 可能出现 ×: 不会出现
脏读 不可重复读 幻读
Read uncommitted √ √ √
Read committed × √ √
Repeatable read × × √
Serializable × × ×
http://www.jb51.net/article/50047.htm
http://blog.csdn.net/fg2006/article/details/6937413
1.乐观锁是在代码层做校验通常使用版本号对比的方式,或者使用时间戳(hibernate自带实现通过annotation:@version)
数据库中保存version整数,每次修改的时候获取版本号然后version+1,提交之前获取库里面的version同时
对库里面的version+1和提交的version值对比如果不相等说明被其他线程修改过,返回错误,如果相等更新数据
2.悲观锁是对数据库的数据进行加锁操作,影响性能
注:
sqlserver采用页级锁:采用串行方式等候上一个操作完成以后才进行下一个操作,并发插入影响效率
oracle采用行级锁:只锁定访问的那一行的数据,并发插入不会有影响
mysql不同的引擎支持不同的锁:
页级:引擎 BDB
表级:引擎 MyISAM ,理解为锁住整个表,可以同时读,写不行
行级:引擎 INNODB , 单独的一行记录加锁
√: 可能出现 ×: 不会出现
脏读 不可重复读 幻读
Read uncommitted √ √ √
Read committed × √ √
Repeatable read × × √
Serializable × × ×
http://www.jb51.net/article/50047.htm
http://blog.csdn.net/fg2006/article/details/6937413