主键自增与一个session插入多个表的冲突

dl348 2018-02-22 11:39:16
框架环境:springboot + mybatis + mysql
mysql中的表,所有表的主键是自增的。现在出现一个问题,要同时插入主从表。从表要填入主表的主键。
但是主表和从表是在同一个session中执行插入的。这样的话,没法在commit之前获取到主表的主键是什么,那样也就没法写入到从表中。
...全文
992 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dl348 2018-03-05
  • 打赏
  • 举报
回复
我测试后发现,其实springboot的事务管理自动就处理了这个问题。调用mybatis保存主表后,可以通过主表的对象获取数据库中对应记录的自增主键,然后把主键填到子表对象的变量中保存即可。 此时,查数据库,发现数据并没有写入到数据库,springboot的事务管理(@Transactional)会在方法的最后做数据同一事务保存。上面提到的mybatis调用主表保存方法,估计是执行保存,但没有commit。 很神奇,还未有保存到数据库,但是已经获取了自增主键的值。
love_0707 2018-02-23
  • 打赏
  • 举报
回复
引用 8 楼 maradona1984 的回复:
[quote=引用 7 楼 love_0707 的回复:] [quote=引用 4 楼 maradona1984 的回复:] 你们主从是自己写代码去控制的?,mysql可以做主从同步的啊,数据库是否主从应该对应用服务透明才对
你那个弄好了吗[/quote] 我觉得我应该理解错了楼主的问题,他说的主表明细表 他的问题大概可以总结为,mybatis获取mysql自增主键 [/quote]对的 他想把获取主键的这个过程放到离数据最近
maradona1984 2018-02-23
  • 打赏
  • 举报
回复
引用 7 楼 love_0707 的回复:
[quote=引用 4 楼 maradona1984 的回复:] 你们主从是自己写代码去控制的?,mysql可以做主从同步的啊,数据库是否主从应该对应用服务透明才对
你那个弄好了吗[/quote] 我觉得我应该理解错了楼主的问题,他说的主表明细表 他的问题大概可以总结为,mybatis获取mysql自增主键
love_0707 2018-02-23
  • 打赏
  • 举报
回复
引用 4 楼 maradona1984 的回复:
你们主从是自己写代码去控制的?,mysql可以做主从同步的啊,数据库是否主从应该对应用服务透明才对
你那个弄好了吗
Voccoo 2018-02-23
  • 打赏
  • 举报
回复
sqlserver中存在着函数SCOPE_IDENTITY(),可以很好的解决你所说的问题,即:插入完成后返回当前插入生成的id。但mysql用的比较少,如果mysql本身已经有这种函数存在的话,你可是适当的在网上找一找。如果不能,推荐你自己写个触发程序。
青年卫大师 2018-02-23
  • 打赏
  • 举报
回复
不要使用musql的事务 自己手动实现事务
maradona1984 2018-02-22
  • 打赏
  • 举报
回复
你们主从是自己写代码去控制的?,mysql可以做主从同步的啊,数据库是否主从应该对应用服务透明才对
love_0707 2018-02-22
  • 打赏
  • 举报
回复
引用 2 楼 dl348 的回复:
[quote=引用 1 楼 love_0707 的回复:] mybatis 的动态SQL 中
<insert useGeneratedKeys="true" keyProperty="id" keyColumn="id"></insert>
插入这条记录后就可以得到返回的主键值
我的意思是,如果执行顺序为:插入主表数据后,获得主键值,再把主键值写入到从表中,插入从表数据,这样的话,主从表的插入就是分开两次事物执行的了。是否有办法可以一次事务处理这两个表?[/quote] 你的意思是让数据库去做这个事啊 我没试过 可能存储过程可以做到 我试试去
dl348 2018-02-22
  • 打赏
  • 举报
回复
引用 1 楼 love_0707 的回复:
mybatis 的动态SQL 中
<insert useGeneratedKeys="true" keyProperty="id" keyColumn="id"></insert>
插入这条记录后就可以得到返回的主键值
我的意思是,如果执行顺序为:插入主表数据后,获得主键值,再把主键值写入到从表中,插入从表数据,这样的话,主从表的插入就是分开两次事物执行的了。是否有办法可以一次事务处理这两个表?
love_0707 2018-02-22
  • 打赏
  • 举报
回复
mybatis 的动态SQL 中
<insert useGeneratedKeys="true" keyProperty="id" keyColumn="id"></insert>
插入这条记录后就可以得到返回的主键值

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧