数据库之事务与事务的隔离级别

什么是事务?

事务是数据库中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤销,也就是事务具有原子性,一个事务中的一系列操作要么全部成功,要么都不执行.

事务的结束有两种,一种是所有步骤成功执行,事务提交成功.第二种是如果其中有任何一个步骤失败,则本次事务的所有操作都应该放弃,即发生回滚操作.

事务的四个特性(ACID)

原子性(atomicity),一致性(consistency),隔离性(Isolation),持续性(Durability)

1.原子性

事务是数据库的逻辑工作单位,事务中包含的操作要么都执行,要么都不执行.

2.一致性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,因此当数据库中只包含成功事务提交的结果时,我们就说数据库处于一致性状态.如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的更改已经写入物理数据库,这个时候数据库就处于不一致的状态中.

3.隔离性

一个事务的执行不能被其他事务干扰,即一个数据内部的操作及使用的数据对其它并发事务是隔离的,并发执行的事务之间不能相互干扰.

4.持续性

也称永久性,指一个事务一旦提交,他对数据库中的数据的改变应该是永久性的,接下来的其他操作或者故障都不应该对其执行结果有任何影响.

数据库操作会产生的三个问题

1.脏读

(针对未提交数据) 如果一个事务中对数据进行了更新,但事务还没有提交,另一个事务可以获取到该书屋没有提交的更新结果,这样造成的结果就是,如果第一个事务回滚,那么.第二个事务在此之前获取到的数据就是一笔脏数据

2.不可重复读

(针对其他提交前后,读取数据本身的对比)不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的.

3.幻读/虚读

(针对其他提交前后,读取数据条数的对比) 幻读是指同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。幻读针对的是多笔记录。如果事务1在事务2的新增操作之前读取一次数据,在事务2的新增操作之后再读取同一笔数据,取得的结果集是不同的,幻读发生。

不可重复读和幻读比较:

两者有些相似,但是前者针对的是update或delete,后者针对的insert。

数据产生问题的解决方案:四种隔离级别

1、Serializable (串行化)

最严格的级别,事务串行执行,资源消耗最大;

2、REPEATABLE READ(重复读)

保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读”和“不可重复读”的情况,但不能避免“幻读”,但是带来了更多的性能损失。(mysql的默认隔离级别)

3、READ COMMITTED (读已提交)

大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读”,但不能避免“幻读”和“不可重复读”。该级别适用于大多数系统。(oracle的默认隔离级别)

4、Read Uncommitted(读未提交)

事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值