Php 拉威尔雄辩-独家交易。
我有一个表,有两列,a和B。集合(a,B)是唯一的,但B本身不是。每当我向表中添加一行时,我希望B获得下一个可用的数字-因此,如果表中有:Php 拉威尔雄辩-独家交易。,php,transactions,laravel-4,locking,eloquent,Php,Transactions,Laravel 4,Locking,Eloquent,我有一个表,有两列,a和B。集合(a,B)是唯一的,但B本身不是。每当我向表中添加一行时,我希望B获得下一个可用的数字-因此,如果表中有: A B 1 1 1 2 2 1 2 2 2 3 然后,如果A=1,插入的下一行将有B=3,如果A=2,插入的下一行将有B=4 因此,给定一个A,我需要从表中选择MAX(B)来知道新值应该是什么,然后运行insert。但是,我希望避免脚本的两个实例获得相同的B值的情况,因此我需要在将select和insert作为单个事务运行之前获得表
A B
1 1
1 2
2 1
2 2
2 3
然后,如果A=1,插入的下一行将有B=3,如果A=2,插入的下一行将有B=4
因此,给定一个A,我需要从表中选择MAX(B)来知道新值应该是什么,然后运行insert。但是,我希望避免脚本的两个实例获得相同的B值的情况,因此我需要在将select和insert作为单个事务运行之前获得表上的独占锁
我能想到的唯一替代方法是编写一个原始数据库查询,执行insert…select,因为eloquent不支持这一点。如果可能的话,我宁愿使用雄辩的功能。那么,有没有办法从laravel那里获得一张桌子的专用锁
这几乎是的重复,但公认的答案是“以不同的方式执行”,这在本例中不起作用。如果我能很好地理解,如果脚本的两个实例获得相同的b值,它们也将具有相同的(a,b)主键,然后无法插入第二个,并将引发异常。对吗?@momo对。捕获异常是一种选择,但不是理想的选择——我宁愿一开始就不抛出它。您的表使用什么存储引擎?@eggyal InnoDB。但这有关系吗?问题是关于雄辩的功能,因为它是相关的。