事务的四大特征和五个隔离级别

事务的四大特征

1.原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做
2.一致性(Consistency):事务完成后,符合逻辑运算。数据不会因为事务的执行而遭到破坏,事务前后数据的完整性必须保持一致
3.隔离性(Isolation):一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰
4.持久性(Durability):一个事物一旦提交,它对数据库的改变就是永久的

五个隔离级别

1.default:默认的事务隔离级别,跟具体的数据有关,mysql默认的事务隔离级别是repeatable_read
2.read_uncommitted: 读未提交,一个事务可以感知或者操作另外一个未提交的事务,可能会出现脏读、不可重复读、幻读
3.read_committed:读已提交,一个事务只能感知或者操作另一个已经提交的事务,可能会出现不可重复读、幻读
4.repeatable_read:可重复读,能够避免脏读,不可重复读,不能避免幻读
5.serializable:串行化,隔离级别最高,消耗资源最低,代价最高,能够防止脏读, 不可重复读,幻读。

脏读:可以读取到另一个事务尚未提交的数据

起初隔离级别为read uncommitted(读未提交):a,b两个会话,分别开启两个事务,然后a向b转了500元钱,但a未提交该事务, 此时b查看,发现多了500,然后a回滚事务,b再查看账户,发现根本就没有多500。

不可重复读:在一个事务中,两次查询的结果不一致

如果我们此时将隔离级别提升为read committed(读已提交),便可避免脏读。同样b两个会话,分别开启两个事务,然后a向b转了500元钱, 但a未提交该事务,此时b查看,依旧是原钱数。但此时,如果a提交事务,b再去查看,发现此时多了500。

可重复读

如果我们此时将隔离级别提升为repeatable read(可重复读),可以避免脏读和不可重复读的发生。同样a提交事务,b再去查看,发现依旧是原钱数,b只能结束当前事务,在开启一个新事务,才能查询到数据的变化,这便避免了不可重复读。 但是如果a事务在提交前插入了几条数据,b事务在第二次读的时候读出来多了几条,这便是幻读

串行化

如果我们设置了seriizable串行化,就相当于锁表,某一时间内只允许一个事务访问该表。

不可重复读和幻读比较

两者有些相似,但是前者针对的是update或delete,后者针对的insert。

你可能感兴趣的:(Java)