我们都知道数据事务有四大特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
一、原子性(Atomicity)
原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。事务的操作如果成功就必须要完全写入到数据库,如果操作失败则不能对数据库有任何影响。
例如:甲给乙转100元,甲操作完转账的时候,乙还没收到款的这时间当中发生异常,就相当于操作失败,不能写入数据库,这时候事务就要回滚,把100元退换给甲。一个转账和一个收账,这是不可分割的,这就是事物的原子性,要么都执行,要么都不执行。
二、一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变到另一个一致性状态。即事务执行前后数据库都是出于一致性状态。
例如:甲乙两人银行账户一共10000元。无论两人怎么相互转账,两人的钱加起来都是10000元,这就是事物的一致性。
三、隔离性(Isolation)
隔离性是一个事务内部的操作及使用的数据对并发的其他事务是隔离的,比如多个用户对同一张表进行操作时,数据库为每一个用户开启一个事务,不能被其他事务干扰,多个并发事务之间是相互隔离的。
例如:一张数据库表有2个事务操作,分别为A和B,事务A要么先执行,执行完再执行事务B,其次就是执行完事务B,再执行事务A。这就是事务的隔离性,避免了事务之间的干扰。
脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。
事务的隔离级别从低到高有:
Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。
Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
四、持久性(Durability)
持久性是指事务一旦提交,对数据库的改变是永久的。即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如:我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到的提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
以上就是我目前理解的,后期将补充多点。
转载于:https://www.cnblogs.com/MrMeng/p/8619372.html
相关资源:数据结构—成绩单生成器