kepware怎么读modbus/tcp数据_学习笔记之mysql数据库事务

一.什么是数据库事务?

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

我们其实从上面事务的定义就能看出来数据库事务解决了什么,我们看下面的例子:

我们A账户向B账户转账1000块钱

(1)A扣款1000元

(2)B加1000元

上面的2个步骤,如果中间任何的环节没有出错,那么转账成功。但是,如果第一个环节扣款完成后,第二个环节出错,没有加上1000元,那岂不是A账户的1000元白扣了?所以,出现了数据库事务。

二.事务的四个基本属性(ACID):

1.原子性(Atomic):

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。(上面的转账例子就是)

2.一致性(Consistent):

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

3.隔离性(Insulation):

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。(简单的说就是一个事务在执行的时候不能受到另一个事务的干扰)

4.持久性(Duration):

事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。(简单的说就是一旦数据库数据写入数据库,数据库确定保存之后,就“说话算话,下棋不悔棋”一样,不受你程序业务逻辑的控制,如果再想改数据就在执行新的事务,就算数据库宕机了,也得恢复数据)

以上是数据库事务的4个原则,其实我们讲数据库,学习数据库,主要是第三点隔离性持久型。我们继续往下看。

三.隔离性的4个隔离级别:

我们怎么解决隔离性的问题呢?那就是上锁,其实和JAVA的线程是一样的,多个线程调用同一个资源的时候,一但某一个线程调用到该资源,那么别的线程就不能在调用这个资源,也是加锁。

c2ca6423b4f4e47b2f35f898f058b4bb.png
图画的烂了点,凑合看吧

那什么是脏读,不可重复读,幻读呢?

1.脏读:

fb11697013493a5880d73da86b0e96be.png

可以看到,我们B事务读取的数据是不对的,如果用这个错误的数据在去做别的业务,那将是灾难性的。也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

2.不可重复读:

79695eddcf62d2d4672d384da26191f6.png

数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。在某种程度上讲,不可重复读并不算是一种错误,具体的要看业务逻辑。

3.幻读:

4cff36b650f5e55bbfd45524a506e04d.png

幻读一般都是作用在行或者列上,比如这个例子,我们先把所有的数据的A字段修改为1,在还没提交的时候,我们又插入了一个新数据,A字段默认是0,之后事务A提交了。会发现这时候还有新增的数据A字段是0,就好像发生了幻觉一样,明明我修改的是所有数据的A字段,怎么会有一个没改完呢?

4.第一类数据丢失(回滚丢失):

7521007c61ccbb07142b17ced9e7986a.png

A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题

5.第二类数据丢失(覆盖丢失/两次更新问题):

6f6a70b1daee2e60658f793b5dba0498.png

A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失

总结:

上面的1-3的问题,我们可以设置数据库的隔离级别就能解决,mysql的默认隔离级别是REPEATABLE-READ,也就是可重复读,上面也说过,可重复读在某种程度上不算是问题,具体要看业务逻辑。

而4-5的问题解决起来比较复杂,我们下篇文章介绍一下mysql的锁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值