当前位置: 首页 > 后端技术 > Java

事务特性ACID和隔离问题

时间:2023-04-01 17:29:24 Java

事务特性数据库事务必须具有ACID特性,ACID是指Atomic(原子)、Consistensy(一致性)、Isolation(隔离)和Durability(持久性)的英文缩写。1、原子性:一个事务中的所有操作要么完成要么不完成,不会在中间某个环节结束。如果事务执行过程中出现错误,会回滚到事务开始前的状态,就好像事务没有执行过一样。2、一致性:一个事务在执行前后必须处于一致的状态。如果事务成功完成,对数据库的所有更改都将生效。如果事务的执行出现错误,所有对数据库的更改将被回滚(undo)并返回到原始状态。3.持久性是指事务一旦提交,其对数据库的改变将是永久性的,即使数据库出现故障,也不会影响数据。4.隔离当多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发事务之间必须相互隔离。多个交易事件相互独立,多个交易事件之间不能相互干扰。隔离问题1.脏读一个事务读取到另一个事务还没有提交的数据,非常严重。应尽可能避免脏读。2.不可重复读在一个事务内多次读取表中的数据,多次读取的结果不同。与脏读的区别在于,脏读读取的是上一个事务未提交的数据,不可重复读读取的是上一个事务的已提交事务。3、幻读(phantomreading)是指在一个事务中读取另一个事务插入或删除数据记录,导致当前事务读取数据不一致。一个事务读取另一个事务提交的数据,强调记录条数的变化,通常SQL类型是insert和delete。是插入和删除语句。不可重复读强调的是数据表内容的变化,主要是update语句。数据库隔离级别数据库定义了4个隔离级别(限制从高到低,性能从低到高):serializable(序列化):可以避免脏读、不可重复读、虚拟读的发生。可重复读(repeatableread):可以避免脏读、不可重复读和不可避免的虚读。mysql使用可重复读。已提交读(readcommitted):可避免的脏读、不可避免的不可重复读、幻读。Oracle使用已提交读。未提交读(readuncommitted):不可避免的脏读、不可重复读、幻读。