MySQL锁
什么是Mysql锁?
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了 传统的计算资源(如CPU,内存,I/O等)的争用以外,数据也是一种供许多用户共享的资源. 如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素. Mysql用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁.这些锁统称为悲观锁(Pessimistic Lock)
锁的基本描述
MySQL这3种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
页面锁:开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁与行锁之间,并发度一般
表级锁
MySQL的表级锁定有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
MySQL 实现的表级锁定的争用状态变量:show status like 'table%';
table_locks_immediate:产生表级锁定的次数;
table_locks_waited:出现表级锁定争用而发生等待的次数;
表锁演示
读锁演示
写锁演示
行锁
读锁:允许其他线程上读锁,但是不允许上写锁。
写锁:不允许其他线程上任何锁。
。
行锁必须要索引才能实现,否则会自动锁全表,两个事务可以用同一个索引,下面给出例子:
读锁由于不排除其他线程再加读锁比较难测试,所以下面用写锁测试,先测试没加所以字段进行加锁,对不同记录进行加锁,如果都加锁成功说明是加了行锁,反之则是默认锁全表。
下面的consumer_chain_order_number是不会重复的,但没有索引
-- 马上显示查询结果
BEGIN;
SELECT * from tyg_consumer_chain_sell_order o where o.consumer_chain_order_number=26911523448454 for update
--一直没有结束知道等待超时
BEGIN;
SELECT * from tyg_consumer_chain_sell_order o where o.consumer_chain_order_number=55181523448554 for update
说明了默认锁全表,接下来试下有索引的字段,这个表的主键
集群搭建之主从复制
Mysql主从复制过程的图形表示
主服务器配置
修改my.conf文件
我起的名叫mysql-bin,到时会生成mysql-bin.000001这样的文件
server-id一般和机器ip尾数一样就行,我的是3
重启mysql服务
service mysqld restart
建立帐户并授权slave
一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
我这边为了演示,用了root账号。让从机通过主机的用户名/密码 root/root登录进入
然后刷新权限
查询master的状态
position=602这个偏移量记住,后面会用到
之前的设置中,发现在/var/lib/mysql文件夹下,已经多出了mysql-bin开头的bin log日志文件
从服务器配置
修改my.conf文件
删除UUID文件
重启并登录到MySQL进行配置从服务器
mysql>change master to master_host='192.168.10.133',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=569
注意语句中间不要断开,master_port为mysql服务器端口号(无引号),master_user为执行同步操作的数据库账户,“120”无单引号(此处的120就是show master status 中看到的position的值,这里的mysql-bin.000001就是file对应的值)。
启动从服务器复制功能
检查从服务器复制功能状态