锁和隔离级别--mysql sql 20170526更新

删掉了之前的博客(摘抄,不精准,理解欠佳)

数据库隔离级别:

http://blog.csdn.net/qq_33290787/article/details/51924963

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

幻读----范围数据、一个事物在读,一个事物在提交

隔离级别

脏读

非重复读

幻像读

read uncommitted

允许

允许

允许

read committed

 

允许

允许

repeatable read

 

 

允许

serializable

 

 

 

 

 

Oracle手动提交,默认read committed。

Mysql是自动提交,默认Repeatable read。

Read uncommitted 可以读到别的事务未提交的数据/事务回滚造成脏读

Read committed 在一个事务中可以读到其他事务提交的数据,这样在提交前后读到的数据不一致  无法重复读。

Repeatable read  在开启一个事务修改数据未提交时,其他事务无法对该数据做修改操作,避免了无法重复读的问题。

Serializable:指的是其他隔离级别无法保证有无新增数据。两次查询结果可能多了N条数据记录。

 

【开启事务做查询时,在其他事务提交前后查询出来数据一致,参考MVCC ,此事务在读取时读取的是mysql快照信息】

关于此 Repeatable read实践

参考http://blog.csdn.net/dong976209075/article/details/8802778

Mvcc参考http://blog.csdn.net/chen77716/article/details/6742128#comments

 

数据库锁和封锁协议:

悲观所和乐观所:

是否加锁:

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

 

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

 

排它锁和共享锁:

1 封锁类型(Locking)
    封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。基本的封锁类型有两种:排它锁(Exclusive locks简记为X锁)和共享锁(Share locks简记为S锁)。
    排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其它事务在T释放A上的锁之前不能再读取和修改A。
    共享锁又称为读锁。若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其它事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

 

封锁协议

排它锁

共享锁

一致性保证

 

操作结束释放

事务结束释放

操作结束释放

事务结束释放

不丢失修改

不脏读

可重复读

一级

 

 

 

 

 

二级

 

 

 

三级

 

 

 

Mysql数据第三级锁协议,但是从上面的例子可以看到它并不是严格的第三级锁协议。

在查询时它运用了数据的快照。

 

Mysql不同引擎的锁类型,行级锁、页锁、表锁

http://www.cnblogs.com/donknap/archive/2010/01/27/1657373.html

 

 

面试问道:测试使用int类型索引:

 

= 1 、>1 、 <> 1 、各种like 1 加% 、is null、BETWEEN  and、都会用到索引

 

面试查询第二大:

 

select max(id) from table where id<(select max(id) from table);

 

衍生查询第N大:

 

select max(id) from table  where id not in (select t.id from (select id from table ORDER BY id desc limit 3) t)

 

研究第N大 question:

 

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

 

这版本的 MySQL 不支持使用LIMIT子句的IN/ALL/ANY/SOME子查询,即是支持非IN/ALL/ANY/SOME子查询的LIMIT子查询。

 

也就是说,这样的语句是不能正确执行的。

 

select * from table where id in (select id from table limit 10)

20170710:

SELECT * FROM `test` LIMIT n,m; 查询从n+1的m个数据

SELECT * FROM `test` LIMIT n OFFSET m ;查询从M+1开始的N条数据

 

主外键关联清空数据、删表等操作。

set FOREIGN_key_checks = 0;

set FOREIGN_key_checks = 1;

 

// 写mysql数据库文档用,用此sql查询关键信息,再贴到word文件表格中,done!
SELECT
    column_name,
    COLUMN_TYPE,
    IS_NULLABLE,
    COLUMN_COMMENT,
    COLUMN_DEFAULT,
    COLUMN_KEY
FROM
    information_schema. COLUMNS
WHERE
    table_name = 'table'
AND table_schema = 'db';

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值