悲观锁

悲观锁,认为数据是悲观的。当我们查询数据的时候加上锁。防止其他线程篡改,直到对方拿到锁,才能修改。

比如,有如下的表。status=1表示可以下单,status=2表示不可以下订单。假如在并发的过程中有两个用户同时查到status=1,那么从逻辑上来说都可以去新增订单,但是会造成商品超卖。

如下例子

CREATE TABLE `goods` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `status` tinyint(4) DEFAULT NULL, `version` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4INSERT INTO demo.goods (id, name, status, version) VALUES (1, 'test', 1, 1);
set autocommit=0;begin;select *from goods where id=1 and goods.status=1 for update ;update goods set status=2 where id=1;
begin;select * from goods where id=1 for update;

(1205, ‘Lock wait timeout exceeded; try restarting transaction')错误,

具体的锁等待时间可以通过设置innodb_lock_wait_timeout参数进行控制。

如果此时在session1中执行commit 操作,那么session2将得到查询结果,并把锁交给session2。

我们还可以通过

show status like 'innodb_row_lock_%';

乐观锁

乐观锁不同于悲观锁,乐观锁是通过自身的程序实现,而不是mySql自身实现。

乐观锁查询的时不上锁,只有在更新的时候检查版本号。

比如我们查询到goods表中version 为1 那么在更新这个表的时候Sql将是

select * from goods where id=1;update goods set status=2,version=version+1 where id=1 and version=1;

总结

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Andorid Dialog 示例【慢慢更新】
  3. Android(安卓)PureMVC
  4. Ubunu下搭建android NDK环境
  5. 自定义SeekBar主题
  6. android SQLite数据库基本操作示例
  7. android draw bitmap 示例代码
  8. Android启动时启动Activity 的定义的位置
  9. Android适配器之------BaseAdapter(例子)

随机推荐

  1. textAppearance 解答,android系统主题样式
  2. Android 天气预报源码
  3. GridView示例2(自动增长)
  4. Android UI之RadioGroup
  5. Android ndk-stack tool
  6. Android调试笔记——Installation error
  7. Android应用程序资源管理器
  8. Android com.android.support 版本不一致
  9. android进度对话框的使用
  10. android一些不常用的事件