带你了解什么是事务
前言
简简单单,带你清楚了解事务。
一、事务是什么?
事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作,要么全部执行,要么全部放弃。 通俗上讲就是,花钱买东西,支付金额后,你将获得商品,这个过程必须完整完成,如果付了钱没得到商品,就应该把钱退给你。二、事务的特性(ACID)?
1、原子性(Atomicity): 事务中所有操作是不可再分割的原子单元。事务中所有操作要么都执行成功,要么都执行失败。
2、一致性(Consistency): 事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账户余额之和应该保持不变。
3、隔离性(Isolation): 隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相干扰。
4、持久性(Durability): 一旦事务提交成功,事务中所有的数据操作都必须被持久化保存到数据库中,即使提交事务后,数据库崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
三、深入事务的隔离性?
-
常见的并发异常
第一类丢失更新:(某一个事物的回滚,导致另外一个数据已更新的诗句丢失了)
可以发现事务二更新完数据应该为9,但是因为事务一的回滚会变成10
第二类丢失更新:(某一个事物的提交,导致另外一个数据已更新的诗句丢失了)
可以发现事务二更新完数据应该为9,但是因为事务一的提交会变成11
脏读:(某一事务读取了另一事务未提交的数据)
可以发现事务二读取到N=11,但是因为事务一回滚了,N=10,所以失误而事务二度读的不存在,是个脏数据。不可重复读:(某一事务,对同一数据前后读取不一致)
如再一次操作中,事务二要读取两次N,第一次N=10,但是在这短暂的期间,事务一提交更改了N,导致第二次读取到的N值发生了变换。幻读:(某一事务对前后查询的表的行数不一致)
如再一次操作中,事务二要查询两次记录,第一次记录为3条,但是在这短暂的期间,事务一提交插入了一条,导致第二次读取到的记录数目发生了变换。
-
常见的事务隔离级别
读未提交(read-uncommitted)所有问题都为解决,换来的是效率极高
读已提交(read-committed)
可重复读(repeatable-read)
串行化(serializable)可以处理所有问题,但是代价大,效率低
所以常用中间哪两种
常见数据库默认隔离级别:
MYSQL:默认隔离界别 可重复读
Oracle: 默认隔离界别 读已提交
Sqlsever: 默认隔离界别 读已提交
N 代表不会出现此类情况
Y 则会出现这类问题
四、这些是如何实现的呢?
实现机制
共享锁:也叫读锁,就是假如我在看房,我就加个读锁此时自己可以看,别人也可以看,不冲突。
排他锁:也叫写锁,就是加入我在入住这间房子,就加一个写锁,此时别人就不能看房和入住了。
-
悲观锁(数据库)
共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。事务A对某数据加了共享锁后,其他事务只能对该数据加共享锁,但不能加排他锁。
排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
事务A对某数据加了排他锁后,其他事务对该数据,既不能加共享锁,也不能加排他锁。
-
乐观锁(需要自定义)
版本号 、时间戳等 在更新数据前,检出版本号是否发生了变化,若变化则取消本次更新,否则就更新数据(版本号+1)
总结
本文内容只是浅显的了解,写得不好的还请见谅,我们一起努力加油哦!!!