事务和锁两种机制的异同点
事物和锁,在面试的时候可以说是必问的两个知识点。当然,并不以面试的出发点来思考这个问题。
事物和锁都是用来处理应用程序数据一致性的问题。
事物
事物的特性ACID:原子性、一致性、隔离性、持久性
原子性:事物视为不可分割的最小单元,事物的所有操作要么全部成功,要么全部失败回滚
一致性:所有事物对同一个数据读取的结果都是一致的
隔离性:任一个事物,在对数据修改作出提交之前,对其他事物都是不可见的,互不影响
持久性:一旦事物提交,其结果就会永久保存到数据库中。
以数据库为例,事物的隔离级别有:
隔离级别 | 脏读 | 不可重复度 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
可串行化 | × | × | × |
脏读、不可重复读、幻读都是并发一致性带来的问题
脏读:假设有a,b两个事物,b读取到a未提交的数据
不可重复读:假设一条数据,a事物第一次读是1,但第二次去读的时候是2
幻读:假设a事物读取多条数据,第一次读是3条,第二次读的时候数据的条数多了或者少了
事物的使用模式类似如下
begin
// do something
end
锁
锁,在数据库中较为简单的是行级锁和表级锁。
锁是用来干什么的呢?锁是用来解决隔离性
的一种机制。
锁的使用模式如下:
lock
// do something
unlock
锁一般分为悲观锁和乐观锁。顾名思义,
悲观锁的出发点是,我总认为这条数据会被人修改,所以我一上来就给它加锁,这样,如果确实是没有人修改这条数据的话,加上悲观锁是比较消耗资源的。
SELECT * FROM table_name WHERE ... FOR UPDATE;
乐观锁,就是我认为别人不会修改数据,通常是通过版本号的方式
update user_info set password='somelog' where username='somelog' and data_version='2020-04-05';
概括
总的来说,事物的范围广泛,锁是解决事物特性中的隔离性的一中工具。即事务的隔离级别通过锁的机制来实现。 对数据库来说,一般开启了锁,也就添加了某种锁。
网友评论