PHP的Oracle PDO是否挂起DELETE?

时间:2009-03-03 05:51:32

标签: php oracle pdo

这是Php(5.2.6-Win32 + Oracle10g)的问题,这是一个错误,还是我做了一些根本错误的事情?

try {
    $conn = new PDO($DB,$USER,$PASSWORD);
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    //connected
    try {
        $conn->exec("DELETE FROM MY_TABLE");
        echo "done";
...

注意:我不知道这是不是一个bug,我猜它是。但是,由于我在快速搜索后无法找到错误报告。我可能做错了什么,所以我想我先问一下这个问题,以及其他人有类似问题的后代问题。

4 个答案:

答案 0 :(得分:2)

没有WHERE的DELETE(很可能)会对表进行全面扫描。 这意味着它会读取“高水位线”下的每个区块 - 这是桌子曾经使用过的每个区块。因此,如果表格曾经非常大,那么删除一些记录可能需要很长时间。 [因为它不知道'在读取所有空格之前只有四个记录。]

截断不会这样做。它只是移动表格的高水位线,以便任何正在使用的区块很快就会被闲置。

答案 1 :(得分:1)

由于PDO似乎在使用起来相当多,但它不太可能,因为Oracle有多大,我不知道。

delete from my_table可能需要一些时间,具体取决于有多少记录。你在等到它被挂了多长时间之前等了多长时间?表中有多少记录?

答案 2 :(得分:1)

数据库中是否还有其他活动同时进行?如果是的话,我怀疑是死锁。一些未提交的DML事务可能会锁定MY_TABLE的某些行。

如果您不需要回滚功能,请考虑使用TRUNCATE代替DELETE

答案 3 :(得分:0)

如果在同一个表上运行某个事务,它可能会阻止您的DELETE。