数据库-事务
数据库并发问题
脏读
事务1:将某条记录的Age值从20修改为30
事务2:读取了事务1更新后的值:30
事务1:回滚,Age值恢复到20
事务2:读取的30就是一个无效值
不可重复读
事务1:读取Age值为20
事务2:将Age修改为30
事务1:两次读取Age值为30,和第一次值读取不一致
幻读
事务1:读取了Stu表中一部分数据
事务2:向Stu表中插入了新的行
事务1:读取Stu表时,多出了一些行
隔离级别
读未提交:READ UNCOMMITTED
允许事务1读取事务2未提交的修改
读已提交:READ COMMITED
要求事务1只能读取事务2已提交的修改
可重复读:REPEATABLE READ
确保事务1可以多次从一个字段中读取的相同的值,即事务1执行期间禁止其它事务对这个字段进行更新
串行化:SERIALIZABLE
确保事务1可以多次从一个表中读取到相同的行,在事务1执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分地下。
传播行为
事务的传播+事务的行为
如果有多个事务嵌套运行,子事务是否要和大事务共用一个事务
传播属性 | 描述 |
---|---|
REQUIRED | 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行 |
REQUIRED_NEW | 当前事务必须启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起 |
SUPPORTS | 如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中 |
NOT_SUPPORTS | 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起 |
MANDATORY | 当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常 |
NEVER | 当前方法不应该运行在事务中,如果有运行的事务,就抛出异常 |
NESTED | 如果有事务在运行,当前的就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行 |