mysql的事务和锁

  1. 手动开启(begin)提交(commit)事务和自动开启提交事务(直接写sql就是自动)。
  2. 事务的四大特征(ACID):原子性(Atomicity)、一致性(Consistent)、隔离性(isolation)、持久性(Durable)。
    原子性:一组操作要么都成功,要么都不成功回滚
    一致性:多说于业务层面,事务执行前是一致性状态,执行后也是一致性状态,拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
    隔离性:多事务操作不能互相干扰
    持久性:事务对数据的改变提交是永久的,就算故障也不会丢失提交事务的操作
  3. 多事务高并发常存在的问题(大到小):脏读、不可重复读、幻读。
    脏读:一个事务读取到另一个事务未提交的数据
    不可重复读:一个事务读取到另一个事务已经提交的update的结果
    幻读:一个事务读取到另一个事务已经提交的insert和delete的结果
  4. 数据库标准规定四大隔离级别(隔离级别从低到高=并发性从高到低):读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)、序列化(Serializable)。
    不同的数据对这四大隔离级别进行了不同的实现,例如mysql实现了这四种隔离级别,oracle仅实现了2种隔离级别。
    读未提交:脏读都没解决,后面更没解决
    读已提交:解决了脏读,没解决不可重复读问题和幻读
    可重复读:解决了脏读和不可重复读问题,没解决幻读
    序列化:脏读、不可重复读、幻读都解决了,但是效率极其低下,一般不用
    注意:mysql默认的隔离级别是可重复读,并且mysql的存储引擎innodb在可重复读的实现上解决了幻读,已知通过锁的机制可以解决幻读。
  5. mysql的2种存储引擎
    (1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
    (2) InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
  6. mysql对于隔离级别的具体实现有2种方式:LBCC(:Lock-Based Concurrency Control基于锁的并发控制)和MVCC(Multi-Version Concurrency Control多版本的并发控制)。
    LBCC:利用各种锁
    MVCC:利用快照,操作的是当前时间点的一个快照
  7. 又分为行锁和表锁
    也可以分为共享锁(Shared Locks),排它锁(Exclusive Locks),意图共享锁(Intention Shared Locks),意图排它锁(Intention Exclusive Locks),记录锁,间隙锁,临键锁
    共享锁(S锁):行级锁,读锁,多个事务对于同一数据可以共享一把锁,都能访问到数据但是只能读不能修改。
    加锁方式:select * from student where id=1 LOCK IN SHARED MODE;
    释放锁方式:commit/rollback
    排它锁(X锁):行级锁,写锁,不能与其他锁并存,也就是说不允许其他事务再获取该行的锁,只有该获取了排他锁的事务可以对事务进行读取和修改。
    加锁方式:
    自动:delete/update/insert 默认加上X锁
    手动:select * from student where id=1 for update;
    释放锁:commit/rollback
    意向锁是由数据引擎自己维护,用户无法手动操作
    意图共享锁(IS锁):表级锁,加共享锁之前会默认加上该锁,为了提高效率(为了减少发生锁之间的冲突,需要检索整张表来查看是否有锁,此时有意图锁的存在可以不用检索了,相当于一个标志)
    意图排他锁(IX锁):表级锁,加排他锁之前会默认加上该锁,相当于一个标志,提高了加锁效率
    下面这三类也可以叫做锁的算法:
    记录锁:行锁,仅仅锁住那一行记录
    间隙锁:锁住2个存在记录之间的区间,该区间不包含2头,可以解决幻读
    临键锁:锁住2个存在记录之间的区间,左开区间右闭区间(相当于记录锁加间隙锁),可以解决幻读
    注意:划分的区间并不是根据你的sql语句的条件,而是根据数据库中现有的记录来划分的
  8. 不存在主键的表(对整张表加锁),存在主键的表(对那个特定的主键加锁),存在唯一键和主键的表(存在主键,主键是一级索引,唯一键是二级索引,假设对二级索引的某条数据加锁,结果是会找到对应的主键索引来加锁)
    唯一键可以为null,但是主键不能为空,主键是一类特殊的唯一键
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值