mybatis保存数据之后取出它的主键保存子表

1.事务提交方面

注解方式:

@Transactional  

  #只能被应用到public方法上,对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
默认情况下,一个有事务方法, 遇到RuntimeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) 

  #在service层中,我们只需将需要加入事务处理的方法用Transactional注解标记
隔离级别
1.ISOLATION_DEFAULT:用底层数据库的默认隔离级别,数据库管理员设置什么就是什么
( @Transactional(isolation = Isolation.DEFAULT))

2.ISOLATION_READ_UNCOMMITTED(未提交读):最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)
(( @Transactional(isolation = Isolation.READ_UNCOMMITTED)))

3.ISOLATION_READ_COMMITTED(提交读):一个事务提交后才能被其他事务读取到(该隔离级别禁止其他事务读取到未提交事务的数据、所以还是会造成幻读、不可重复读)、sql server默认级别
(@Transactional(isolation = Isolation.READ_COMMITTED))

4.ISOLATION_REPEATABLE_READ(可重复读):可重复读,保证多次读取内容一致,禁止读取到别的事务未提交的数据(该隔离基本可防止脏读,不可重复读(重点在修改),但会出现幻读(重点在增加与删除))(MySql默认级别,更改可通过set transaction isolation level 级别)
(@Transactional(isolation = Isolation.REPEATABLE_READ))

5.ISOLATION_SERIALIZABLE(序列化):代价最高最可靠的隔离级别(该隔离级别能防止脏读、不可重复读、幻读)
丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的;
幻读:同样的事务操作过程中,不同时间段多次(不同事务)读取同一数据,读取到的内容不一致(一般是行数变多或变少)。
脏读:一个事务读取到另外一个未提及事务的内容,即为脏读。
不可重复读:同一事务中,多次读取内容不一致(一般行数不变,而内容变了)。
(@Transactional(isolation = Isolation.SERIALIZABLE))

注意:幻读与不可重复读的区别:幻读的重点在于插入与删除,即第二次查询会发现比第一次查询数据变少或者变多了,以至于给人一种幻象一样,而不可重复读重点在于修改,即第二次查询会发现查询结果比第一次查询结果不一致,即第一次结果已经不可重现了。

数据库隔离级别越高,执行代价越高,并发执行能力越差,因此在实际项目开发使用时要综合考虑,为了考虑并发性能一般使用提交读隔离级别,它能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题。

propagation=Propagation.REQUIRED, 传播行为(规则)

1.事务的传播行为,默认值为 Propagation.REQUIRED。可以手动指定其他的事务传播行为,如下:
 @Transactional(propagation = Propagation.REQUIRED)
 
2.如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
 @Transactional(propagation = Propagation.SUPPORTS)

3.如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
@Transactional(propagation = Propagation.MANDATORY)

4.如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
@Transactional(propagation = Propagation.REQUIRES_NEW)

5.重新创建一个新的事务,如果当前存在事务,延缓当前的事务。
@Transactional(propagation = Propagation.NOT_SUPPORTED)

6.以非事务的方式运行,如果当前存在事务,暂停当前的事务。
@Transactional(propagation = Propagation.NEVER)

7.以非事务的方式运行,如果当前存在事务,则抛出异常。
@Transactional(propagation = Propagation.NESTED)

2.是配置sql的参数方面

<!-- 保存 -->
    <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        insert into t_user(name,age)
        values(#{name},#{age})
    </insert>
**useGeneratedKeys="true" keyProperty="id"关键这里**
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值