1、事务的ACID,其中把事务的隔离性详细解释一遍?
事务其实就是单个数据逻辑单元组成的对象操作集合,而数据库的终极目标就是使数据库从一个一致的状态换成另外一个一致的状态。ACID中的一致性,原子性,隔离性,持久性就是为了实现该目标。
一个事务是一连串的操作组成增删改查的集合,就好比java方法一样,java方法中有N条语句对属性进行修改,在java与剧中,有一个语句执行出现了问题导致抛出了异常,相当于这个方法只执行了一半。如果只执行一半的话,那么的他的一致性很有可能遭到破坏。所以原子性就是要求你一个方法要么全部执行成功,要不就不执行。所以原子性是一致性的必要条件。但是只保证了原子性不能说就能保证其一致性。
因为原子性保证了,一个事务未提交的时候,发生了错误就执行回滚,那么事务就不会提交,但是当事务执行成功了,commit之后会让事务刷盘,进行持久化操作,但刷盘的过程中如果出现了某些因素导致刷盘中断。事务的持久性就保证这种问题发生,当数据库因为某种原因宕机的或,重启的时候,数据库会根据提交日志进行回滚,将未写完的数据写入进去。
原子性,持久性是事务一致性的充分条件,还有一个问题就是线程安全的问题,数据库是支持并发访问的,这自然而然就会导致线程安全的问题。事物的隔离性则解决了这种线程安全问题。并发事务下,多个事务有自己的事务空间,相互独立互不干扰。在java方法中,不同的方法都有自己的栈帧,虽然多个线程调用同一个方法,但是不同进程进入这个方法的栈帧是相互独立的。如果你在这个类中定义了成员变量,线程在工作的时候,会将主内存中的数据拷贝到工作内存的栈帧中。这样对数据的任何操作都是基于工作内存,并且不能直接操作主内存以及其他线程内存中的数据,之后将更新的数据刷到主内存中。这种会引发线程安全的问题。
事务的隔离性,就是多个并发事务都是独立事务上下文的,彼此之间相互隔离的,但是多个事务如果对共享数据进行查看,删除,修改的话,会出现线程安全的问题,需要使用锁机制。当线程A修改,让线程B不要来查看共享数据,除非A修改完毕。数据库封装了四把锁,对应四种隔离级别
不考虑事务的隔离性,可能产生的问题
1、脏读:当一个事务多次修改某个数据,