Revision #4 has been created by samdark on Aug 6, 2011, 1:03:08 PM with the memo:
Updated configuration for 1.1.8
« previous (#3) next (#5) »
Changes
Title
changed
How to use nested DB transactions (MySqlQL 5+, PgSqlostgreSQL)
Category
changed
TutorialHow-tos
Yii version
unchanged
Tags
unchanged
db, mysql, postgresql, transaction, nested
Content
changed
sSource code taken from: [PHP, PDO & Nested Transactions](http://www.kennynet.co.uk/2008/12/02/php-pdo-nested-transactions/)
.
tTested with: MyS
qlQL 5.1.30
+ Yii 1.1.8.
Problem:[...]
With default Yii implementation, PDO will throw exception saying there already is active transaction.
But there's a solution :)
First, you'll need to extend PDO class and save it in your the protected/components directory:[...]
```
Then, you'll need to alter the behaviour of [CDbConnection::createPdoInstance()]. You can do this by making a subclass of it in protected/components/NestedDbConnection.php
There, change $pdoClass toNow you
r c
lass name (NestedPDO in this example):
```php
class NestedDbConnection extends CDbConnection
{
protected function createPdoInstance()
{
$pdoClass='NestedPdo';
if(($pos=strpos($this->connectionString,':'))!==false)
{
$driver=strtolower(substr($this->connectionString,0,$pos));
if($driver==='mssql' || $driver==='dblib')
$pdoClass='CMssqlPdoAdapter';
}
return new $pdoClass($this->connectionString,$this->username,
$this->password,$this->attributes);
}
}
```
Note that $this->_attributes was also changed to $this->attributes so the subclassing will work.
Now you can add the class name to thean use it in db configuration array in
`protected/config/main.php
`:
```php
'db'=>array(
'c'pdoClass'
=>
'Nested
DbConnection',
PDO',
'connectionString' => ...
),
```
That's it, there you go
;)