数据库事务ACID

什么是数据库事务

事务在当今的数据库应用系统中无处不在,即使在高并发环境下也可以提供数据的完整性。
在数据库中事务是由一组SQL语句组成的逻辑处理单元(即一个事务是一个包含所有读/写操作成功的集合)。

事务的特性

事务具有以下4个特性,通常简称为事务的ACID特性:
A(Atomic)原子性
C(Consistent)一致性
I(Isolated)隔离性
D(Durable)持久性

原子性

原子性确保每个事务处理要么完全被运行,要么完全不被运行,而且如果被运行就是在单个不可分隔的动作中进行的。当某个事务处理在进行中,其他进程都不能看到任何的中间状态(即对外部来说,事务处理是不可见的)。

一致性

一致性意味着如果系统具有某些必须报错的不变性,而且在事务处理之前就保持着,那么在事务处理之后也将继续保持着。例如,在银行系统中,一个关键的不变性就是金额的守恒定律。在每次内部转帐之后,银行的金额数量必须与转帐之前的相等,但在事务处理的某个瞬间,这种不变性可能被破坏,但是在事务处理的外部是看不见的。

隔离性

隔离性是指并发的多个事务是独立运行的,不会相互干扰。着意味着,如果有两个或多个事务处理同时运行,对它们相互之间或对其他进程来说,最后的结果看上去就像所有的事务处理是按某种顺序依次运行的。

  • 多个事务并发的话,应该和多个事务串行执行效果一致.
  • 事务的四个隔离级别:
    • 串行化:保证所有情况下都不会发生。【锁表】
    • 可重复读:会出现幻读。【会锁定所读取的所有行】
    • 读未提交:会出现脏读、幻读、不可重复读。【隔离级别最低,并发性能高】
    • 读已提交(默认): 会出现幻读、不可重复读。【锁住正在读取的行】
    • 总结:四个级别逐渐增强。每个级别分别解决一个问题,事务级别越高,性能越差,大多数环境下ReadCommit情况下就可以了。
  • 脏读、幻读、不可重复读:
    • 脏读:一个事务读取了另一个事务未提交的数据,而这个数据有可能被回滚。
    • 幻读:事务不同独立执行时发生的一种现象。事务1读取指定Where条件的结果集,然后事务2插入一条新数据,而这条新数据刚好满足事务1所查询的条件,然后事务1再次查询时,看到了事务2新提交的数据。【幻读强调的是新增、删除。同样的条件,两次查询的记录数不同】
    • 不可重复读:在一个事务范围内,两次查询得到不同的结果。【不可重复读强调的是修改。同样的条件,两次查询的记录值不同】

持久性

持久性表示事务一旦提交,不论发生了什么,该事务处理都将往前进行下去,而且其结果是永久性的。事务处理提交后,不能回滚结果或丢弃结果。

猜你喜欢

转载自blog.csdn.net/weixin_44630798/article/details/87897832