关于并发的问题:乐观锁和悲观锁
2016-06-30 18:37
218 查看
关于并发的问题:乐观锁和悲观锁
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
相关文章推荐
- C++模板的特化与偏特化
- fuel8:vmware workstation上的安装
- Penetration Testing Tools Cheat Sheet 20160630
- Spring:com.sun.proxy.$proxy0 cannot be cast to XXX
- 私有的静态成员变量
- 通货膨胀与通货紧缩
- JavaSE 基础 第44节 引用外部类的对象
- infa规范器组件实现行列转换
- centos接口压力测试apache bench(ab)压力测试
- spring整合redis
- CodeForces 557A Ilya and Diplomas
- JavaSE 基础 第43节 静态内部类
- 优化range双滑块及单选开关按钮
- Android 动态隐藏显示导航栏,状态栏
- iOS UITableView(二)-自定义Cell
- JavaSE 基础 第42节 局部内部类
- [javaEE] jsp的指令
- Android获取手机的型号等
- Java——数组
- [MySQL优化案例]系列 — RAND()优化