0%

数据库-事务

数据库-事务

数据库并发问题

  1. 脏读

    事务1:将某条记录的Age值从20修改为30

    事务2:读取了事务1更新后的值:30

    事务1:回滚,Age值恢复到20

    事务2:读取的30就是一个无效值

  2. 不可重复读

    事务1:读取Age值为20

    事务2:将Age修改为30

    事务1:两次读取Age值为30,和第一次值读取不一致

  3. 幻读

    事务1:读取了Stu表中一部分数据

    事务2:向Stu表中插入了新的行

    事务1:读取Stu表时,多出了一些行

隔离级别

  1. 读未提交:READ UNCOMMITTED

    允许事务1读取事务2未提交的修改

  2. 读已提交:READ COMMITED

    要求事务1只能读取事务2已提交的修改

  3. 可重复读:REPEATABLE READ

    确保事务1可以多次从一个字段中读取的相同的值,即事务1执行期间禁止其它事务对这个字段进行更新

  4. 串行化:SERIALIZABLE

    确保事务1可以多次从一个表中读取到相同的行,在事务1执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分地下。

传播行为

事务的传播+事务的行为

如果有多个事务嵌套运行,子事务是否要和大事务共用一个事务

传播属性 描述
REQUIRED 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
REQUIRED_NEW 当前事务必须启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起
SUPPORTS 如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中
NOT_SUPPORTS 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
MANDATORY 当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常
NEVER 当前方法不应该运行在事务中,如果有运行的事务,就抛出异常
NESTED 如果有事务在运行,当前的就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行