数据库事务

1.基本概念

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态
事务处理的原则:所有事务作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有事务都被提交(commit),那么这些修改就被永久的保留;要么数据库管理系统将放弃所有的修改,整个事务回滚(rollback)到最初状态

2事务的ACID特性

2.1原子性(atomicity)

原子性要求事务是一个不可分割的工作单位。例如,账户a向账户b转账100元,则a余额减少100而b余额增加100。如果转账失败,应该保证a和b的余额不变,而不能是a减少b保持不变,或者
a不变b增加。

2.2一致性(consistency)

一致性是指,事务执行前后,数据从一个合法状态变换到另一个合法性状态。
此时的合法状态要求满足预定的约束(现实世界的约束),而不是语法合法。满足现实世界的约束,数据就是一致的,不满足这个约束,数据就是不一致的。如果事务中的某个操作失败了,系统就会撤销当前正在执行的事务,返回到事务操作之前的状态。
在这里插入图片描述

2.3隔离性(isolation)

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

2.4持久性(durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
在这里插入图片描述

2.5总结

原子性是对外体现,隔离性是对内体现,一致性是约束条件,持久性是最终目的之一

3.事务的状态

事务是一个抽象的概念,对应着一个或多个数据库操作

3.1活动的(active)

事务对应的数据库操作正在执行的过程中

3.2部分提交的(partially committed)

当事务中的最后一个操作执行完成时,但由于操作都在内存中执行,所造成的影响没有刷新到磁盘

3.3失败的(failed)

事务处在多动的或部分提交的状态时,遇到了某些错误(数据库自身的错误或直接断电等,或认为地停止当前事务地执行)而无法继续执行时

3.4中止地(aborted)

如果事务执行了一部分而变为失败的状态,那么就需要把已经修改的事务中的操作还原到事务执行前的状态。这个过程称为回滚,此时事务处于中止的状态

3.5提交的(committed)

当处于部分提交状态的事务将修改过的数据都同步到磁盘上后,事务处于提交的状态

3.6状态转换图

在这里插入图片描述

4.事务隔离级别

4.1引入

某个事务在对某个数据进行访问时,其他事务应该进行排队。当事务提交之后,其他事务才可以继续访问这个数据,但是这样对性能影响太大。事物的隔离性和数据库访问效率需要取舍。
设置表中数据
在这里插入图片描述

4.2数据并发问题

1)脏写(dirty write)

一个事务修改了另一个未提交的事务修改过的数据
在这里插入图片描述
2)脏读(dirty read)
SessionA读取了已经被SessionB更新但是没有被提交的字段,之后若SessionB回滚,SessionA读取的内容就是临时且无效的
在这里插入图片描述
3)不可重复读
SessionA读取了一个字段,然后SessionB更新了该字段,之后SessionA再次读取一个字段,值就不同了
在这里插入图片描述
4)幻读(phantom)
SessionA从一个表中读取了一个字段,然后SessionB在该表中插入了一些新的行,之后,如果SessionA再次读取同一个表,就会多出几行,意味着发生了幻读
在这里插入图片描述
数据并发问题分为两类,一种写错误:脏写(修改了别人修改的数据,导致别人修改发生错误),另一种读错误:脏读,不可重复度,幻读。读错误取决于另一个事务B在修改数据时,某个事务A读发生的时刻。如果事务B修改了数据,还未提交,此时事务A读取数据,而事务B回滚,发送脏读错误。如果事务B未修改数据,事务A第一次读,事务B修改数据然后提交之后,事务A第二次读,事务A两次读操作获得的结果不同,发生不可重复读。如果事务B未执行操作,事务A第一次读,事务B执行插入操作,事务A第二次读,事务A两次读取到的行数不同,发生幻读。
注:由于事务一致性的要求,确保了事务提交后,数据处于合法状态。而事务在未提交时,数据不一定处于合法状态,此时对数据进行访问,则会发生以上错误。
按严重程度排序:
脏写 > 脏读 >不可重复读 > 幻读

4.4SQL中规定的四种隔离级别

为了提高数据库的并发性能,需要舍弃一部分隔离性,从而设立了隔离级别,隔离级别越低,并发问题发生的就越多,而并发性能越高。
1)READ UNCOMMITTED:读未提交,所有事务都可以看到其他事务未提交的执行结果。可以避免脏写,而不能避免脏读,不可重复读,幻读
2) READ COMMITTED:读已提交,一个事务只能看见已提交事务所做的改变。可以避免脏写,脏读,而不能避免不可重复读,幻读
3)REPEATEABLE READ:可重复读,事务A在读到一条数据后,此时事务B对该数据进行了修改并提交,那么使事务A再次读取改数据时,仍然读取到的还是原来的内容。可以避免脏写,脏读,不可重复读,不可避免幻读。事务B两次读操作读取到了不同的内容,此不符合人们的操作逻辑。
4)SERIALIZABLE:可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作。所有并发问题都可以避免,但性能十分低下
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值