程序中突然出现一个情况,一个数据被重复提交两次。于是有同事指出你代码中其中一行做了另一个表的操作,由于外部事务中断不会也终止这条操作,所以导致了,重写, 然而我想说这个不太符合我的知识体系,于是我做了实验。此次开发框架是tp5
建立两张表test1,test2,分别有字段id、name和id、b_name,然后做如下种情况操作:
1、启动表1的事务,但是只写入表2插入一条数据,回滚表1
2、启动表1事务,对表2插入,然后回滚表2,
3、启动表1事务,对表2插入,然后commit表1,
4、启动表1事务,对表2插入,然后commit表2,
5、启动表2的事务,但是只写入表1插入一条数据,回滚表2
6、启动表2事务,对表1插入,然后回滚表2,
7、启动表2事务,对表1插入,然后commit表2,
8、启动表2事务,对表1插入,然后commit表1,
9、启动xdebug,启动表1事务,对表2插入,下一句是对表1插入,但是断点卡在对表1 插入时,然后强制程序中断,
经过以上实验得出结果:
1、事务发生到对应语句时,的确与数据库有交互(会影响自增id的游标记录),但是没有commit之前是不会对数据造成影响
2、事务一旦启动,除非回滚或者提交,否则期间操作都将被丢弃,
3、实验只针对单线情况讨论,多线程情况不做分析
ps:另外修改的操作也做了,事实也和我原有理论知识一样,事务提交之前,其他的语句是不会被修改的,