Spring事务的特性(ACID)
原子性 (atomicity):强调事务的不可分割.使用事务对数据进行修改的操作序列,要么全部执行,要么全不执行。通常,某个事务中的操作都具有共同的目标,并且是相互依赖的。如果数据库系统只执行这些操作中的一部分,则可能会破坏事务的总体目标,而原子性消除了系统只处理部分操作的可能性。
一致性 (consistency):事务的执行的前后数据的完整性保持一致,一致性是通过原子性来保证的。
例如:在转账时,只有保证转出和转入的金额一致才能构成事务。也就是说事务发生前和发生后,数据的总额依然匹配。
隔离性 (isolation):隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间既不能看到对方的中间状态,也不能相互影响。
例如:在转账时,只有当A账户中的转出和B账户中转入操作都执行成功后才能看到A账户中的金额减少以及B账户中的金额增多。并且其他的事务对于转账操作的事务是不能产生任何影响的。
持久性(durability) :事务一旦结束,数据就持久到数据库
持久性指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库,即使数据库出现故障,提交的数据也应该能够恢复。但如果是由于外部原因导致的数据库故障,如硬盘被损坏,那么之前提交的数据则有可能会丢失。
事务的并发问题(可能发生的数据安全问题)
脏读(Dirty read):当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
不可重复读(Unrepeatableread):指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(Phantom read):幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复度和幻读区别:不可重复读的重点是修改,幻读的重点在于新增或者删除。
MySQL默认隔离级别,可重复读(REPEATABLE_READ)
Oracle默认隔离级别,读已提交(READ_COMMITTED)
1.读未提交(最低事务隔离界别 READ_UNCOMMITTED):这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
可能发生问题 脏读,不可重复读,幻读
2.读已提交(READ_COMMITTED) :保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现
解决问题:脏读
可能发生问题 不可重复读,幻读
3.可重复读(Mysql默认隔离级别 REPEATABLE_READ): 这种事务隔离级别可以防止脏读、不可重复读,它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。
解决问题:脏读 , 不可重复读
可能发生问题幻读
4.串行化 (最高事务隔离级别 SERIALIZABLE):这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。
解决问题:脏读,不可重复读,幻读
timeout 超时时间:
事务一定要在多长时间之内提交,如果不提交就会回滚
readOnly 只读事务:
事务是否只能读取数据库的数据,如果为true,则不允许进行增删改
rollbackFor 指定发生回滚的异常:
当方法发生哪些异常时才会回滚
noRollbackFor 指定不发生回滚的异常:
当方法发生哪些异常时,不会回滚