很长时间没有写了,也没能管住自己,希望写下这篇文章可用督促自己是可不要忘记学习。
话不多说,开始对spring事务进行个人总结。
首先,先了解下什么是事务?
事务就是逻辑上的一系列操作,要么全部成功,要么全部不成功。
事务有一些特性,叫做acid,分别是原子性,一致性,持久性,隔离性。
下面分别解释下四个特性,原子性,指的是事务中的操作属于一个单位,要么操作全部发生,要么全部不发生。
一致性,表示事务前后数据的完整性必须一致。
持久性,一个事务一旦被提交,他对数据库中的数据操作是永久的,即使数据库发生异常也不会呗影响。
隔离性,多个用户并发访问数据库时,一个用户的事务不被另外一个人的事务打扰,多个并发事务之间互不影响。
在了解了什么是事务和事务的特性后,那么便会需要事务,如果没有事务的隔离性的话,有多个用户并发进行时,数据库中的数据就会被干扰。此时就产生了读问题。读问题共有三个,分别是脏读,不可重复读,幻读。
脏读,指的是一个事务读取到了另外一个事务修改但还未提交的数据,若事务回滚,则读到的数据是无效的。
不可重复读,指的是多次读取同一个数据,返回的结果不一样。
幻读,指一个事务读取到了另一个事务插入的数据,导致前后读取不同。
既然产生了这些问题 ,就需要对其进行解决,可用通过设置事务的隔离级别来避免这些问题,
有五个隔离级别,分别是default,READ_UNCOMMITED,READ_COMMITED,REPEATABLE COMMITED,SERIALIZABLE。
default指的是底层数据库所使用的隔离级别,如mysql使用的是REPEATABLE COMMITED,oracle数据库使用的是read_commited。
default也是spring选择用的隔离级别。
read_uncommited允许读取未提交而修改的的数据,可产生脏读,不可重复读,幻读。
read_commited允许在并发事务提交后读取,可防止脏读,但不可重复读和幻读仍有可能发生。
repeatable read对相同字段的多次读取是一致的,除非数据被事务改变,可以防止脏读,不可重复读,但幻读仍有可能发生。
serializable 完全服从acid的隔离级别,确保不发生脏读,不可重复读,幻读,这在所有的隔离级别中是最慢的。是典型通过完全锁定在事务中涉及的数据表而完成的。
mysql中:
查看当前事务的隔离级别;
select @@TX_ISOLATION;
更改当前事务的隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。