private $readOnly = false;
public function get( $code, $key ) {
- if ( $this->writesDone ) {
- $db = wfGetDB( DB_MASTER );
+ if ( $this->writesDone && $this->dbw ) {
+ $db = $this->dbw;
} else {
$db = wfGetDB( DB_SLAVE );
}
throw new MWException( __METHOD__ . ": Invalid language \"$code\"" );
}
- $this->dbw = wfGetDB( DB_MASTER );
+ // We must keep a separate connection to MySQL in order to avoid breaking
+ // main transactions. However, SQLite deadlocks when using two connections.
+ // @TODO: get this trick to work on PostgreSQL too
+ if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
+ $lb = wfGetLBFactory()->newMainLB();
+ $this->dbw = $lb->getConnection( DB_MASTER );
+ $this->dbw->clearFlag( DBO_TRX ); // auto-commit mode
+ } else {
+ $this->dbw = wfGetDB( DB_MASTER );
+ }
$this->currentLang = $code;
$this->batch = array();
* @ingroup Cache
*/
class SqlBagOStuff extends BagOStuff {
- /** @var LoadBalancer */
- protected $lb;
-
protected $serverInfos;
/** @var array */
$db = DatabaseBase::factory( $type, $info );
$db->clearFlag( DBO_TRX );
} else {
- /*
- * We must keep a separate connection to MySQL in order to avoid deadlocks
- * However, SQLite has an opposite behavior. And PostgreSQL needs to know
- * if we are in transaction or no
- */
+ // We must keep a separate connection to MySQL in order to avoid deadlocks
+ // However, SQLite has an opposite behavior.
+ // @TODO: get this trick to work on PostgreSQL too
if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
- $this->lb = wfGetLBFactory()->newMainLB();
- $db = $this->lb->getConnection( DB_MASTER );
+ $lb = wfGetLBFactory()->newMainLB();
+ $db = $lb->getConnection( DB_MASTER );
$db->clearFlag( DBO_TRX ); // auto-commit mode
} else {
$db = wfGetDB( DB_MASTER );