问题描述
mysql的存储过程会自动开启一个事务吗
问题出现的环境背景及自己尝试过哪些方法
问题是这样的,有一段代码,这段代码开启了事务,整个请求就开启了这一个事务,这个事务中间有调用一个存储过程,这个存储过程就是更新了一些数据,存储过程里面是没有显示开启事务的,就begin,end就完了。
这个事务里面有更新一条数据,执行完后,代码里面又有个操作去更新存储过程里面刚刚更新过了的同一条数据,这里就发生了锁等待超时了。
你期待的结果是什么?实际看到的错误信息又是什么?
我想问的是,调用执行存储过程,存储过程里面没有开启事务,它会自动开启一个新的事务吗?而且没有自动提交。
导致后面操作相同数据的时候拿不到锁。
我通过查看MySQL的锁情况和代码测试,发现确实是存储过程开启了一个新的事务,执行完后也没有提交,一直挂在那里。
当你决定使用存储过程的时候,那么整个事务是在MYSQL端完成的。
对于事务竞争优化的主要一点就是减少事务锁时间。
你选择了使用存储过程就可以不用再代码中开启事务,深度优化即将事务SQL在MYSQL端执行(存储过程)
以下是类似的秒杀事务落地的存储过程
这属于并发优化的阶段了,不要过度依赖存储过程,其一般用于简单的逻辑