mysql中事务和锁【3,6,7,8,20,21,30】

一:事务的四个基本特性及隔离级别?

   1.基本特性: 原子性,隔离性,一致性,持久行。

   2.隔离级别: 读未提交:一个事务还没有提交的时候,它的修改可以被其他事务看到。

                          读提交:一个事务提交以后,它的修改才可以被其他事务看到。

                          可重复读:一个事务启动和提交,中间过程中看到的数据是一致的,未提交的数据,同样对其他事务不可见。

                         串行化:顾名思义,读加读锁,写加写锁。当出现读写锁冲突时,一个事务等另外一个事务执行完,才能执行。

二:mysql中有哪几种锁,各用在什么场景,有什么优化方案?

    全局锁:数据库备份的时候使用(flush tables read lock),释放锁用(unlock tables);用了只能锁备份,业务就要停摆。如果是innodb库,用 mysqldump 使用 -single-transaction参数启动,导数据之前会启动一个事务,确保拿到唯一性视图。

    表锁:lock tables ....read/write      本线程的读锁,会显示本线程和其他线程的写锁。本线程的写锁,会限制其他线程读写操作。

      unlock taables;另外一种表级锁是MDL锁,对表结构修改加写锁,其他情况加读锁。修改一个表结构,要十分小心。要kill掉长事务,要设置等待时间,等待一段时间后,还没拿到写锁,直接放弃,后来再重试。

    行锁:行锁和间隙锁组成 next-key lock 【在可重复读隔离级别下的】。但是行锁+ 间隙锁锁的粒度变小了,容易出现死锁。解决办法,将隔离级别改成读提交,并将binlog_format改成row就可以了。

三:什么是死索,怎样解决死锁。

   不同线程,相互等待对方的资源而陷入僵持状态。开启死锁检测,尽量减少死锁检测次数。将可能出现死锁的行放在最后,在热点资源上做并发控制。

四:自增锁是什么?

     自增锁需要占用资源,建议申请完以后立即释放。但是有可能出现数据不一致。将innodb_autoinc_lock_mode =2;

所有的申请自增主键的动作都是申请后就释放锁。【还要将binlog_format=row防止出现数据不一致】innodb_autoinc_mode =1;

默认是1,普通insert语句,自增锁在申请之后马上释放。类似insert...select这样的批量插入数据的语句,自增锁还是要等语句结束后才能释放。

五:什么是幻读,解决幻读带来什么新的问题。

  在同一个事务中,后一次查询看到了前一下查询看不到的行,(专指新插入的行)。行锁+间隙锁,问题就解决了。又出现锁粒度太小,容易出现死锁。这种情况,将隔离方式改成读提交,binlog_format=row防止数据不一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值