首页 > 编程知识 正文

数据库事务处理的理解,数据库中范式详解

时间:2023-05-06 02:55:13 阅读:154920 作者:4801

数据库事务的详细提示:进行事务主要是为了保证复杂的数据库操作数据的一致性。 特别是同时访问数据时。 MySQL事务主要用于处理操作量大、复杂度高的数据。

一.什么是数据库事务? 从根本上理解MySQL事务是作为单个逻辑工作单元执行的一组操作,可以完全执行,也可以失败并全部回滚。

最典型的例子:

用户—— )将100元汇入用户b账户。

正常逻辑:先从用户a的账户中扣除100元,然后用户b的账户增加100元,转账操作就完成了。 这是普通的情况。 接下来我们来看看这种情况。

用户A账号扣除100元,此操作语句执行完毕,刚要执行用户B账号增加100元,突然系统出现问题,停机后程序未按流程进入下一步。 此时,用户a的账户减少了100,但用户b的账户没有增加100。 那我们该怎么办呢? 这个时候应该使用事务。

如前所述,作为单个逻辑工作单位执行的一系列操作可以是完全执行的,或者失败地全部回滚。 要么系统全部执行,要么运行失败到一半进行回滚。 用户a账户被扣了100元,试图向用户b账户添加100元时发生了问题。 好啊。 出了问题就出问题了。 回滚到用户a账户再加100元不就行了吗?

二、事务有什么状态?事务一共分为五个状态:

在重新执行与活动的 (active )事务相对应的数据库操作期间,此事务处于活动状态。

如果部分提交的 (partially committed )数据库事务的最后一个操作已完成,但由于所有操作都在内存中执行,因此影响未更新到磁盘,则事务将处于部分提交状态。

失败的 (failed )事务处于活动状态或部分提交状态时,发生某些错误(数据库本身错误、操作系统错误或直接断电)而无法继续执行,或者当前事务

中止的 (aborted )事务中途执行且失败时,取消失败事务对当前数据库的影响的过程称为回滚。 回滚操作完成后,如果数据库返回到执行事务之前的状态,事务将终止。

提交的 (committed )处于部分提交状态的事务将所有更改的数据同步到磁盘后,事务将处于已提交状态。

三、事务具有什么特性?事务共有四大特性:

1 .原子事务的所有数据操作要么成功执行,要么全部失败并回滚到未执行之前的状态,就像此事务从未执行过一样。 如果的操作成功,则必须完全应用于数据库,如果操作失败,则不应该影响数据库。

2 .一致性(Atomicity )一致性是指事务必须从一个一致状态向另一个一致状态转换,即,在执行一个事务之前和之后都必须处于一致状态一致处理数据库中所有语义约束的保护。 如果数据库的状态满足所有完整性约束,则该数据库可以说是一致的。 例如,如果数据库处于一致状态S1,则必须对数据库执行事务。 假设在事务执行期间数据库的状态不一致,事务执行完成后,数据库将处于一致状态S2。

3 .隔离性(Consistency )多个事务以前相互隔离,互不影响。 数据库可以读写和修改多个并发数据,隔离可以防止在多个事务同时执行时由于交叉执行导致的数据不一致。

例如,在操作同一个表的情况下,数据库必须是每个用户都已经打开的事务,并且不得干扰其他事务的操作,并且多个并发事务之间必须相互隔离。

隔离性分为四个隔离级别:

读未提交(Read Uncommitted):

在此隔离级别,所有事务都可以看到其他未提交事务的执行结果。 该隔离级别的性能不如其他级别好,而且会产生脏读,因此很少投入使用。 读取未提交的数据也称为脏读取。

读已提交(Read Committed):

这是大多数数据库系统的缺省隔离级别。 但是,这不是MySQL的缺省设置。 满足了隔离的简单定义。 一个事务只能看到已经提交给办事处的更改。 但是,如果事务a多次读取同一数据,则结果可能不一致,因为事务a多次读取同一数据,而事务b在事务a多次读取时更新并提交了该数据。

可重复读(Repeatable Read):

读取数据的事务禁止写入事务,写入事务禁止其他读取事务。 避免了不可重复的读取和脏读取,但会发生幻读。 这意味着第二次查询数据包含在第一次查询中未发生的数据。 虽然避免了重复读取和污渍读取,但有时可能会出现幻读。 这可以通过“共享读锁定”和“独占写锁定”来实现。 MySQL的默认隔离级别。

序列化(Serializable):

执行一个事务时,要禁止其他事务的执行,必须是一个

一个进行。提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。

四种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。 MySQL默认隔离级别是可重复读。

4.持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即对已提交事务的更新能恢复。一旦一个事务被提交,DBMS(数据库)必须保证提供适当的冗余,使其耐得住系统的故障。所以,持久性主要在于DBMS的恢复性能。

四、事务是如何实现的

事物是通过事物日志来实现的,事物日志包括:redo log和undo log;

redo log 是重做日志:
重做日志是每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改。

undo log 是回滚日志
回滚日志是当一些事务在执行一半时,发生意外,导致后续操作无法完成,则可以根据回滚日志恢复到执行该事务之前的壮态。


另外推荐一篇sql语法调优文章,希望对各位小伙伴能有所提升!

SQL语法优化宝典传送门

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。