数据库 锁问题
MyISAM 只有表锁
读锁 也叫共享锁
MyISAM表查询会加表锁 致使其余的 inster update 等待
lock tables 表 read|write; 加锁 unlock tables;解锁
MyISAM 上了写锁 其余都须要等待 这个写锁也加 排它锁
select 上 排它锁 select * from 表 for update;
innoDB 有表锁 有行锁
查看是否自动提交事务后解锁 show variables like 'autocommit';
关闭自动提交 set autocommit = 0 ;(只针对当前session(一个窗口一个sql session),)
另外一个 begin transaction ; sql ; commit;(打开事务)
事务提交后 会自动释放锁。(事务和锁俩个概念,事务常常用,锁通常自动控制了,也可手动干预加锁解锁)
查询上读锁 select * from 表 lock in share mode;(非共享读锁)
手动实现乐观锁
给数据价格version字段 默认为0 代码里面首先读到id=1 的 version 为0 更新时set version = 0+1 而且where条件为 id=1 and version = 0 ,
另外一个程序假如执行过查询version 为0 并更新 set version = 0+ 1 where id=1 and version = 0 后,数据库的 id= 1的version = 1了,那么第一个 更新的sql就更新影响行数为0,使用业务代码来判断失败就能够了。
数据库事务的四大特效
持久性 对事务的提交保存,是会被完整记录到的,不会提交了事务 忽然断电数据未更新的状况~~~ innoDB数据库重启时会在 redo log file 文件中对事务进行重作!!!
查看session隔离级别 select @@tx_isolation;
设置当前session 的隔离级别 set session transaction isolation level read uncommitted;
read uncommitted(未提交读)
MySql事务开始BEGIN和START TRANSACTION网上都很多人使用,到底它们有什么区别呢,如下是一些经常使用的用法;
事务的开始: BEGIN或START TRANSACTION都是显式开启一个事务; 事务的提交: COMMIT或COMMIT WORK都是等价的; 事务回滚: ROLLBACK或ROLLBACK WORK也是等价的;mysql
RC[已提交读]read committed 设置隔离级别为 已提交读 (也叫‘读写提交’ 能够解决脏读问题,是oracle的默认隔离级别)set session transaction isolation level read committed;
RR[可重复读]repeatable read 设置隔离级别为innoDB的默认隔离级别 可重复读 set session transaction isolation level repeatable read;
设置隔离级别为最高级 串行化 set session transaction isolation level serializable ;能够解决幻读。!
mysql innoDB的可重复读 如何 避免幻读的呢?
快照度就是普通的select 会幻读脏读等等(非串行化的隔离级别下)
当前度就是加锁的 select 和 update, delete, inster , select...lock b share mode,select...for update
read view mysql的可见性算法 是用来结合undo log和这一行数据的隐层列作判断大小,来实现是显示快照度仍是当前读
扩展 mvcc 多版本并发控制读不加锁 读写无冲突 !!并发性能max (mysql实现伪mvcc)
Gap锁
gap锁会对非惟一索引 的 区间加锁 ,该区间为左开右闭的区间,好比 update 表 set vip = true where Money > 10000 and Moneny < 30000 的 sql ,会对 Money字段索引的中的 (10000,30000]区间加锁, 这个区间的列的 id 汇集索引也会有这个gap锁,这个区间的 列都会有锁, 而区间外的 sql 就不会有锁例如 :inster 表 values(xxxx) [表中有money>30000 的数据 id > (select id from biao where money=30000) 的 插入 ,能够直接执行, update where money <5000 的 sql也不会 有锁,大大提升了 批量更新操做的 并发性 。。。。我的理解,一样也是为了不幻读的发生!!!]