中国建设银行网站个人客户官网,微赞直播,wordpress 主题 google字体,如何做房地产微信推送网站广告假设订票的时候#xff0c;好几个人同时进入#xff0c;查看这张票是否售出#xff0c;假如同时购买了这张票#xff0c;那对于售票行业来说#xff0c;可能就会发生低级错误。那么如何避免这类事情发生呢#xff1f;
解决办法#xff1a;
在一个人访问的时候#xf…假设订票的时候好几个人同时进入查看这张票是否售出假如同时购买了这张票那对于售票行业来说可能就会发生低级错误。那么如何避免这类事情发生呢
解决办法
在一个人访问的时候另外一个人不可以访问将票锁住锁完之后再更新让其他的线程来访问。
在C/C中常见的锁分为两类表锁行锁
1、表锁将整个表都锁柱整张表都不可以访问 Innodb和MyISAM都可以
1.1、锁住表的读
其他人都不能读
lock table t_vedio read;
1.2、锁住表的写
其他人都不可以写但是可以读
lock table t_vedio write;
1.2、解锁
unlock tables;
但是它的缺点就是假定一张的表里面有很多张票例如从北京到陕西北京到甘肃北京到上海等票都在一个库里面这个时候如果你将整个表锁住了但是他们之间又米有竞争关系起始就是浪费了资源其他线程都必须等一个操作完成之后才能进入下一个。所以表锁在很多情况下是没必要的但是Innodb和MyISAM都支持表锁。而表锁只适用于Innodb支持事务的rollback。
2、行锁事务
select *from t_tickets XXX for update;
2.1、取票/查看票
//取票my.StartTransaction();
bool LXMysql::StartTransaction(){//有一个start Transaction的接口只需要调用另外一个接口也就是把自动提交return Query(set autocommit0);}
2.2、锁住表
select *from t_tickets where sold0 order by id for update;
2.3、 购买这张票
10s之后这张票的状态置为1也就是卖出了 //购买这张票//模拟冲突 3s过后更新这张票this_thread::sleep_for(10s);
2.4、更新表将第一张票置为1售出了更新一下表
//更新string id rows[0][0].data;//取出第一行的id号 找到了这张票data[sold] 1;string where where id;where id;//更新成功cout my.Update(data, t_tickets, where) endl;
2.5、提交事务 my.Commit();my.StopTransaction();
bool LXMysql::StopTransaction(){return Query(set autocommit1);}bool LXMysql::Commit(){return Query(commit);}
3、演示
3.1、假设现在数据库里的表都没有售出 3.2、现在进来两个人来买票找到你的代码的exe文件
启动两次exe
当不使用行表的时候一张票被两个人购买
select *from t_tickets where sold0 order by id 使用行锁起始也就是加了行锁for update;
根据时间顺序购买不同的票id2的票被买走之后顺次购买id3的
select *from t_tickets where sold0 order by id for update;