数据库之事务的四大特性
一:原子性(Atomicity)
事务是数据库执行的最小单位 不可被分割 ,这个单位里包含了一系列操作(DML),事务的原子性保证数据要么同时执行成功 要么同时执行失败,简单来说:数据库对数据进行操作的时候会将操作写入日志(此日志非传统的日志 可能是缓存 可能是文件)进行保存,如果中间某个事务执行失败,数据库会通过该日志进行回溯,将执行成功的操作进行撤销,专业术语称之为(回滚),如果所有的事务都执行成功,可以通过commit将执行成功的操作提交到数据库进行保存,专业术语(持久化),数据一旦被持久化 便不可在进行回滚
PS:总结起来一句话 原子性保证事务的同事要么同时执行成功 要么同时执行失败
二:一致性(Consistemcy)
如果把事务比作是一扇门,a,b,c作为一个整体穿过这扇门,成功的穿过之后,就变成了 A,B,C;那么我们来看,事务执行完毕前,abc三者保持了一致性,事务执行完毕之后,ABC三者保持了一致性。对于数据库事务来说,不可能出现AbC或者abC等不一致的情况;
那么我们可以认为:原子性是事务一致性的保证!!
PS:总结起来一句话 在事务执行前后 对于不同的事务读取同一数据的结果是相同的
三:持久性(Durability)
简单来说,事务提交后,数据会真正保存到数据库(生米煮成熟饭了),就不能回滚了(熟了还能再弄成生米??)
PS:总结起来一句话 在事务通过commit提交之后 对于数据库的数据便会永久生效 不会再有回滚改变的可能
四:隔离性
这个特性我先举个例子:有个浴室(外面无法偷看),假设每次只能进去一个人,在这个人出来之前,另外一个人不能进去,那么已经进去的这个人根本就不用担心被别人看光,因为浴室里就他一个人。但是外边的其他人就会等不及,显然浴室不够用;那么我们是不是把浴室隔成隔断间,那是不是很多人能一起进入浴室,使用不同的隔断间洗澡了~(当然,一个隔断间还是只允许一个人进去)
我们回到数据库事务,数据库就想到了一个办法,对于并发执行的事务隔离开,相互之前不影响执行!如果有两个相同的事务,在相同的时间内,执行相同的功能,这时候事务的隔离性起作用了,它会确保每一个事务在系统中认为只有自己在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。通过设置数据库的隔离级别,可以达到不同的隔离效果(后面的篇章中会讲到spring事务的隔离级别和传播机制)。
PS:总结起来一句话 在不同的事务之间操作是完全独立的 不同的事务操作不会被其余的事务进行骚扰