23.事务&锁

这篇博客深入探讨了事务的ACID原则,包括原子性、一致性、隔离性和持久性,并详细介绍了事务的四种隔离级别。接着,文章讨论了锁的概念,包括悲观锁和乐观锁的定义、实现方式及其优缺点。悲观锁具有独占性和排他性,而乐观锁则在更新时检查冲突。最后,作者强调了细化锁粒度在高并发环境中的重要性,以降低锁带来的性能影响。
摘要由CSDN通过智能技术生成

事务&锁

事务

事务,由一组 sql 语句组成的执行单元,要么都执行成功,要么回滚。事务符合 ACID 原则

ACID 原则

  • Atomicity-原子性:执行单元,要么执行成功,要么回滚

  • Consistency-一致性:事务开始和结束之后,数据库的完整性约束没有破坏

  • Isolation-隔离性:多个事务并发执行时,彼此之间并不会相互影响

  • Durability-持久性:事务对数据库所做的更改会持久的保存在数据库中

事务的隔离性

数据库中事务的隔离性分为了 4 个层级

  • read uncommitted:未提交读,会引发 脏读,不可重复读,幻读
  • read committed:已提交读,会引发 不可重复读,幻读
  • repeatable read:可重复读,会引发 幻读
  • serializable :序列化

事务的隔离性越高,并发性越低,对业务系统的影响性也就越大。

悲观锁

定义:指对数据被外界修改持悲观态度,具有独占性和排他性。

分类:

  • 共享锁(读锁,S 锁):允许其他进程读,但不允许修改
  • 排他锁(写锁,X 锁):锁定期间,不允许其他进程读写

实现:依赖于数据库的锁机制

实例:

start transactionselect p.productCount from product p where p.productId = 1 for update;
 
update product p set p.productCount=p.productCount-1 where p.productId=1 ;
 
commit;

乐观锁

定义:指外界对数据修改持乐观态度,认为其他进程不会影响到自己要修改的数据。

实现:使用程序便可实现

  • 使用数据版本实现:为数据增加一个 version,每修改一次数据便使 version 变大,只增不减。
  • 使用时间戳实现:天然递增性

实例:

start transaction;

// version = 1
select p.productCount, p.version from product p where p.productId = 1;

update product p set p.productCount=p.productCount-1, p.version=p.version+1 where p.productId = 1 and version = 1;

commit

// 不在事务中也可实现

// version = 1
select p.productCount, p.version from product p where p.productId = 1;

update product p set p.productCount=p.productCount-1, p.version=p.version+1 where p.productId = 1 and version = 1;

悲观锁 VS 乐观锁

悲观锁:依赖于数据库锁,效率低。更新失败的概率低

乐观锁:并未真正加锁,效率高。但一旦锁的粒度把握不好,更新失败的概率较大,容易发生业务失败。

在现在 3 高的要求下(高并发,高性能,高可用),悲观锁用的越来越少。

细化锁粒度

不要长时间持有不必要的锁

// 控制了只有 p.count 为 1 时才采用锁机制
update product p set p.count=p.count-1 where p.id=1 and p.count-1>0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值