// If you need to set an ISOLATION level or LOCK MODE it needs to be done BEFORE you make the BeginTransaction() call...
//
// **note** you should always check result codes on operations and do error handling. This sample code
// assumes all the calls work so that the order of operations is accurate and easy to see
//
// THIS IS using the PECL PDO::INFORMIX module, running on fedora core 6, php 5.2.4
//
// This is the correct way to address an informix -243 error (could not position within table) when there
// is no ISAM error indicating a table corruption. A -243 can happen (if the table/indexes, etc., are ok)
// if a row is locked. The code below sets the LOCK MODE to wait 2 minutes (120 seconds) before
// giving up. In this example you get READ COMMITTED rows, if you don't need read committed
// but just need to get whatever data is there (ignoring locked rows, etc.) instead of
// "SET LOCK MODE TO WAIT 120" you could "SET ISOLATION TO DIRTY READ".
//
// In informix you *must* manage how you do reads because it is very easy to trigger a
// lock table overflow (which downs the instance) if you have lots of rows, are using joins
// and have many updates happening.
//
// e.g.,
$sql= "SELECT FIRST 50 * FROM mytable WHERE mystuff=1 ORDER BY myid"; /* define SQL query */
try /* create an exception handler */
{
$dbh = new PDO("informix:host=......");
if ($dbh) /* did we connect? */
{
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->query("SET LOCK MODE TO WAIT 120")
# ----------------
# open transaction cursor
# ----------------
if ( $dbh->beginTransaction() ) # explicitly open cursor
{
try /* open exception handler */
{
$stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT))
{
$data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\t" . $row[3] . "\t" . $row[4] . "\t" . $row[5] . "\t" . $row[6] . "\t" . $row[7] . "\n" . $row[8] ;
//print $data;
print_r($row);
};
$stmt = null;
}
catch (PDOException $e)
{
print "Query Failed!\n\n";
print "DBA FAIL:" . $e->getMessage();
};
$dbh->rollback(); # abort any changes (ie. $dbh->commit()
$dbh = null; # close connection
}
else
{
# we should never get here, it should go to the exception handler
print "Unable to establish connection...\n\n";
};
};
}
catch (Exception $e)
{
$dbh->rollback();
echo "Failed: " . $e->getMessage();
};