数据库事务、隔离性、悲观锁和乐观锁

数据库事务的四大特性

  1. 原子性(Atomicity)
    原子性是指事务包含的操作要么全部内容执行成功,要么全部内容失败回滚。
  2. 一致性(Consistency)
    一致性是指事务必须使数据库一个一致性状态变换到另一个一致性状态,也就是事务操作执行前和操作执行后保持相同的一致性状态,最经典的例子就是A跟B转账,A和B总数2000,不管相互之间转了多少次,总数2000是不会变,个人感觉有点像能量守恒定律。
  3. 隔离性(Isolation)
    隔离性是当多个用户并发访问数据库时,如同时操作数据库同一张表,数据库为每个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。假如有两个事务C和D,要么D在C之前完成,要么D在C之后开始,这样的形式才会形成事务的隔离状态。
    Read uncommitted
    读取未提交的信息,有脏读情况的危险存在
    Read committed
    读取提交的信息,有不可重复读的情况
    Repeatable Read
    读取数据(事务开启),此时不允许修改数据,有幻读情况的危险存在
    Serializable
    串行化顺序执行,读取数据时,禁止修改,插入,不存在脏读、不可重复读和幻读的问题,但是这种隔离级别效率低下,比较耗数据库性能,一般不使用。
  4. 持久性(Durability)
    持久性就是我们一个事务一旦提交,那么对数据库中的数据改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

隔离性四种状态数据库实现原理:

  1. 未提交读(Read uncommitted)
    读取数据时,未加任何锁:所以事务1在读取某行数据时,事务2也可以对这行进行读取、更新操作。
    修改数据时,添加了行级共享锁:所以事务1在修改某行数据时,添加了行级共享锁,事务2会读取到事务1修改后,但未提交的数据,并且就不能添加排它写锁,所以不能更新这行数据(因此会出现脏读现象)
  2. 提交读(Read committed)
    读取数据时,加行级共享锁,一旦读完该行,就会释放行级共享锁:事务1在对某行数据进行读取时,因为是共享锁,所以事务2也可以读取这行数据,但是当事务1对某行数据读取结束之后,事务2立马就能对这行数据加上排它写锁,并对其进行修改操作结束之后,事务1再次读取这行数据发生变化(因此出现不可重复读)
    修改数据时,加行级排它锁,直到事务结束才释放:事务1在修改某行数据时,会先加上排它锁,直到事务结束,事务2在此期间无法对这行数据进行读取(解决脏读问题)
  3. 可重复读(Repeatable Read)
    读取数据时,加行级共享锁,直到事务结束:事务1读取某行数据时,会增加共享锁,直到事务结束才会释放,所以事务2在此期间可以对这行数据进行读取,但不能加排它锁,因为不能修改这行数据(解决不可重复读问题)
    修改数据时,加行级排它锁,直到事务结束时释放:情况和提交读的修改数据时一样
    注:但无法解决事务1读取数据集时,事务2往这个表中插入新的数据集(未加表级锁,出现幻读问题)
  4. 可序列化(Serializable)
    读取数据时,加表级共享锁,直到事务结束时释放:事务1对表数据读取时,事务2也可对表数据读取,但无法对表数据进行更新、修改、插入等操作(解决幻读)
    修改数据时,加表级排它锁,直到事务结束时释放:事务1对表数据读取时,事务2不可对表数据读取,但无法对表数据进行更新、修改、插入等操作

悲观锁和乐观锁

悲观锁

含义:1)有强烈的独占和排它特性,2)对数据被外界修改持保守态度,3)在整个数据处理过程中,将数据处于锁定状态。
关系型数据库:行锁、表锁和读锁、写锁

乐观锁

含义:1)每次都认为别人不会修改,所以不会上锁,2)但是更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
使用场景:多读少写的,这样可以提高吞吐量
实现:使用版本号,发现冲突,上层应用会不断的进行retry。
锁实现

往往依靠数据库提供锁机制

原因:数据库才是真正对数据库访问具有排它性,应用无法保证外部系统不会修改数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值