数据库的事务
-
事务的基本概念
所谓事务,是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分隔的工作单位。
事务通常以bigin transaction开始,以commit或rollback结束。commit表示提交开启事务后的所有操作,即将事务中的所有对数据库的更新操作写回到物理磁盘中去,事务正常结束。rollback表示回滚,即在事务过程中发生了某些错误或故障,事务不能继续执行,而将事务中所有已完成的操作撤销,回到事务之前的状态。
事务是恢复和并发控制的基本单位。 -
事务的四个特性(ACID)
-
原子性
-
一致性
-
隔离性
-
持久性
-
-
并发操作可能带来的问题
-
脏读
-
不可重复读
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。-
幻读
-
-
mysql的事务级别
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
-
spring事务隔离级别
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。