数据库锁

数据库 锁问题

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也不会 有锁,大大提升了 批量更新操做的 并发性 。。。。我的理解,一样也是为了不幻读的发生!!!]

相关文章
相关标签/搜索