事务隔离级别
为什么要使用事务的隔离级别:
为了保证并发操作数据的正确性及一致性
数据库的事务隔离级别:
READ UNCOMMITTED:(read uncommitted)读取未提交的数据。
这是最不安全的一种级别,查询语句在无锁的情况下运行,并能读取到别的未提交的数据,造成脏读,如果未提交的那个事务数据全部回滚了,而之前读取了这个事务的数据即是脏数据,这种数据不一致性读造成的危害是可想而知的。
READ COMMITTED:(read committed) 读取已提交的数据。
一个事务只能读取数据库中已经提交过的数据,解决了脏读问题,但不能重复读,即一个事务内的两次查询返回的数据是不一样的。如第一次查询金额是100,第二次去查询可能就是50了,这就是不可重复读取。
REPEATABLE READ:(repeatable read)可重复读取数据,这也是Mysql默认的隔离级别。
一个事务内的两次无锁查询返回的数据都是一样的,但别的事务的新增数据也能读取到。比如另一个事务插入了一条数据并提交,这个事务第二次去读取的时候发现多了一条之前查询数据列表里面不存在的数据,这时候就是传说的中幻读了。这个级别避免了不可重复读取,但不能避免幻读的问题。
SERIALIZABLE:(serializable) 可串行化读。
这是效率最低最耗费资源的一个事务级别,和可重复读类似,但在自动提交模式关闭情况下可串行化读会给每个查询加上共享锁和排他锁,意味着所有的读操作之间不阻塞,但读操作会阻塞别的事务的写操作,写操作也阻塞读操作。
Java Spring 的事务隔离级别
ISOLATION_DEFAULT :(default) spring 默认的事务隔离级别
它与数据库的默认隔离级别是一样的
其余四种和数据库的定义是一样的:
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
七个事务的传播行为
1,propagation_required
如果一个事务存在,则支持当前事务,如果不存在,则创建新的事务
2,propagation_supports
如果一个事务存在,则支持当前事务,如果不存在,则非事务的方法运行
3,propagation_mendatory
如果一个事务存在,则支持当前事务,如果存在,则抛出异常
4,propagation_requires_new
总是要开启一个新的事务,如果事务存在,将该事务挂起
5,propagation_not_supported
总是非事务方法运行,并挂起所有的事务
6,propagation_never
总是非事务方法运行,如果事务存在则抛出异常
7,propagation_nested
某一个事务存在,则运行在一个嵌套的事务中