事务的特性

事务的特性

如果一个数据库生成事务的操作,那么该数据库必须具备以下四大特性 (简称: ACID) :
1.原子性 (Atomicity)
  一次事务中如果进行多个数据操作的业务,最终结果要拿所有操作都成功,要么所有操作都失败.

2.一致型 (Consistency)
  一致性就是数据表中的数据更新要求合乎逻辑的特性,满足了原子性不一定满足一致性.

3.隔离性 (Isolation)
  隔离性是当多个用户并发访问数据库时,比如操作同一张表,数据库为每一个用户开启的事务,
不能被其他事务的操作所干扰,多个并发事务之间要相互隔离.

4.持久性 (Durability)
  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,
即便是数据库系统遇到故障的情况下也不会丢失提交事务的操作.
ex:
  比如事务提交还没来得及在磁盘中进行数据的更新就因为系统出现了故障(如:断电)
导致本次事务提交了但是没有真正更新数据,此时应该在供电恢复之后会继续将没有更新的数据进行更新(需要介质),
因为要进行备份或日志记录等等,这些操作一般是DBMS完成,或者有专门的容灾处理.

事务没有隔离性会发生的几种问题:
1.更新丢失
  如果多个线程操作,基于同一个查询结构对表中的记录进行修改,name后修改的记录将会覆盖前面修改的记录,
前面修改的记录就丢掉了,这就叫做更新丢失,这是因为系统没有执行锁操作,因此并发事务并没有被隔离开来.
  第 1 类丢失更新: 事务 A 撤销时,把已经提交的事务 B 的更新数据覆盖了
  第 2 类丢失更新: 事务 A 覆盖事务 B 已经提交的数据, 造成事务 B 所做的操作丢失.
  解决方法: 对行加锁,只允许并发一个更新事务.

2.脏读
  脏读是指事务处理过程中读取了另一个事务未提交的数据 (即将回退的数据).
  解决方法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题(加锁)

3.不可重复读
  一个事务对同一行数据重复读取两次,但是却得到了不同的结果.事务 T1 读取某一数据后,事务 T2 对其做了修改,
当事务T1再次读取该数据时得到与前一次不同的值.
  解决方法:如果只有在修改事务完全提交之后才可以读取数据, 则可以避免该问题

不可重复和脏读的区别是:
  脏读是某一事务读取了另一个未提交的脏数据 (即将回滚的数据),
  而不可重复读取则是读取了前一事务提交(更新) 的数据.
注意:
  在某些情况下, 不可重复读并不是问题, 比如我们多次查询某个数据当然以最后查询得到的结果为主

4.虚读(幻读)
  指两次执行同一条 SELECT 语句会出现不同的结果, 第二次读取会增加或减少数据,
并没有说这两次执行时在同一事物中.
ex:
  目前工资五1000的员工有10人. 那么事物 1 中读取所有工资为 1000 的员工,得到10条记录;
这时事物 2 向员工表插入了一条员工记录, 工资也为 1000; 那么事物 1 再次读取所有工资为1000的员工
共读取到了11条记录.
  解决方法:如果在操作事物完成数据处理之前, 任何其他事务都不可以添加新数据,则可以避免该问题

posted @ 2019-07-26 11:24  笑长不爱笑QvQ  阅读(152)  评论(0编辑  收藏  举报