Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 82

MySQL में Transactions

MySQL में Transaction क्या है?

Transaction related database operations को one logical unit में group करती है। School fee payment, order checkout या bank transfer several rows और tables बदल सकते हैं; partial completion database को गलत छोड़ देगा। Transaction application को one final decision देती है: सभी valid changes COMMIT करें या सभी uncommitted changes ROLLBACK करें

Faculty definition: Transaction operations की sequence है जो database को one valid state से another valid state तक ले जाती है और single unit of work मानी जाती है।
StageDatabase stateAction
Start से पहलेPreviously committed dataComplete business unit plan करें
ActiveChanges current session में pendingRows validate और DML execute करें
CommittedChanges permanentApplication को success दें
Rolled backPending changes cancelledFailure report या safe retry करें

Verified Bank Transaction Lab

Schema transaction से पहले बनाएँ क्योंकि DDL implicit commit करा सकती है। Both tables explicitly InnoDB use करती हैं।

CREATE TABLE bank_accounts (
  account_id INT PRIMARY KEY,
  holder_name VARCHAR(60) NOT NULL,
  balance DECIMAL(12,2) NOT NULL,
  CONSTRAINT chk_nonnegative_balance CHECK (balance >= 0)
) ENGINE = InnoDB;

CREATE TABLE transfer_ledger (
  transfer_id BIGINT PRIMARY KEY,
  from_account INT NOT NULL,
  to_account INT NOT NULL,
  amount DECIMAL(12,2) NOT NULL,
  status VARCHAR(20) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT chk_positive_amount CHECK (amount > 0),
  CONSTRAINT fk_transfer_from FOREIGN KEY (from_account)
    REFERENCES bank_accounts(account_id),
  CONSTRAINT fk_transfer_to FOREIGN KEY (to_account)
    REFERENCES bank_accounts(account_id)
) ENGINE = InnoDB;

INSERT INTO bank_accounts VALUES
(101, 'Asha',  5000.00),
(102, 'Ravi',  3000.00),
(103, 'Meera', 1200.00);
Opening total balance = 9200.00

Total एक useful invariant है: transfer individual balances बदलेगा, पर combined 9200.00 create या destroy नहीं होना चाहिए।

Transaction Commands और Boundaries

START TRANSACTION;
-- SELECT, INSERT, UPDATE और DELETE statements
COMMIT;

START TRANSACTION;
-- statements जिन्हें रखना नहीं है
ROLLBACK;
StatementPurposeTransaction end?
START TRANSACTIONExplicit multi-statement transaction शुरूStart करती है
COMMITCurrent changes permanentहाँ
ROLLBACKCurrent uncommitted changes cancelहाँ
SAVEPOINT namePartial recovery point markनहीं
ROLLBACK TO nameOne savepoint के बाद का work undoनहीं

BEGIN ad-hoc transaction start करने का alias है, लेकिन START TRANSACTION clearer है और transaction characteristics support करता है। Stored programs में BEGIN सामान्यतः compound block खोलता है, इसलिए transaction control permitted और appropriate हो तो START TRANSACTION लें।

COMMIT के साथ Safe Transfer

दोनों account rows को consistent order में lock करें, source balance validate करें, फिर debit, credit और audit insert को one unit की तरह चलाएँ।

START TRANSACTION;

SELECT account_id, balance
FROM bank_accounts
WHERE account_id IN (101, 102)
ORDER BY account_id
FOR UPDATE;

UPDATE bank_accounts
SET balance = balance - 1000.00
WHERE account_id = 101
  AND balance >= 1000.00;

-- Application ROW_COUNT() = 1 confirm करे।
UPDATE bank_accounts
SET balance = balance + 1000.00
WHERE account_id = 102;

INSERT INTO transfer_ledger
  (transfer_id, from_account, to_account, amount, status)
VALUES
  (9001, 101, 102, 1000.00, 'COMMITTED');

COMMIT;
101 | Asha | 4000.00 102 | Ravi | 4000.00 103 | Meera | 1200.00 Total | 9200.00 Ledger rows | 1

Conditional debit zero rows affect करे तो application blindly continue न करे। Error throw करके ROLLBACK करे। Database हर business rule SQL text से स्वयं infer नहीं कर सकता।

Controlled Test से ROLLBACK सिद्ध करें

START TRANSACTION;

UPDATE bank_accounts
SET balance = balance - 300.00
WHERE account_id = 103;

SELECT balance FROM bank_accounts
WHERE account_id = 103;
-- Current session को 900.00 दिखता है।

ROLLBACK;

SELECT balance FROM bank_accounts
WHERE account_id = 103;
-- Final balance फिर 1200.00 है।
Transaction के अंदर: 900.00 ROLLBACK के बाद: 1200.00

Full ROLLBACK transaction के InnoDB locks भी release करता है। Data already committed हो जाने के बाद rollback को ordinary correction mechanism न समझें; auditable history चाहिए तो compensating business transaction record करें।

Autocommit, Session Scope और Storage Engines

MySQL sessions सामान्यतः autocommit = 1 से शुरू होती हैं। Explicit transaction के बाहर each successful statement अपनी transaction होती है और बाद वाली statement के साथ बाद में group नहीं हो सकती।

SELECT @@autocommit;       -- सामान्यतः 1
SET SESSION autocommit = 0;
-- COMMIT या ROLLBACK तक transaction open रहती है।
COMMIT;
SET SESSION autocommit = 1;
  • Normal session behavior unchanged रखने के लिए clearly bounded unit पर explicit START TRANSACTION prefer करें।
  • Autocommit per session है; one connection का change दूसरी को नहीं बदलता।
  • InnoDB tables लें। Nontransactional table के changes ROLLBACK undo नहीं कर सकता।
  • One critical transaction में storage engines mix न करें।
  • Autocommit disabled connection final COMMIT के बिना close हो तो MySQL open transaction roll back करता है।

Implicit Commits और Non-Rollback Traps

कई DDL और administrative statements active transaction को implicitly end करती हैं। Common examples: CREATE TABLE, ALTER TABLE, DROP TABLE, TRUNCATE TABLE और CREATE INDEX। MySQL atomic DDL, DDL operation को protect करती है; इसे surrounding business transaction का part नहीं बनाती।

START TRANSACTION;
UPDATE bank_accounts SET balance = balance + 50
WHERE account_id = 101;

ALTER TABLE bank_accounts ADD COLUMN branch_code CHAR(4);
-- Later ROLLBACK earlier UPDATE undo करेगी, यह expect न करें।
Production rule: migrations और schema changes controlled deployment में रखें, fee, order या payment DML के बीच नहीं।

Concurrency, Error Handling और Best Practice

Normal SELECT later update के लिए rows reserve नहीं करती। SELECT ... FOR UPDATE matching InnoDB records पर COMMIT या ROLLBACK तक locking read लेती है। इससे balance check और change के बीच का gap बंद होता है।

  1. Transactions short रखें; locks held हों तो user input की प्रतीक्षा न करें।
  2. Deadlocks घटाने के लिए shared rows same order में access करें।
  3. FOR UPDATE और UPDATE predicates पर indexes रखें।
  4. Debit, credit और ledger statement के बाद affected-row count check करें।
  5. Every exception catch करें, ROLLBACK करें और selected deadlock जैसे transient failures ही retry करें।
  6. Money के लिए DECIMAL लें, FLOAT नहीं।
  7. सभी business invariants verify होने के बाद ही commit करें।

अब complete transaction example, ACID properties और COMMIT, ROLLBACK तथा SAVEPOINT पढ़ें।

Official संदर्भ

Syntax और behavior official MySQL 8.4 manual से check किए गए हैं। Production use से पहले अपने server पर workflow, permissions और failure paths test करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

MySQL में transaction क्या है?
Transaction one logical unit of work है जिसमें one or more SQL statements होती हैं। COMMIT successful changes permanent करता है और ROLLBACK uncommitted changes cancel करता है।
क्या MySQL में autocommit default enabled होता है?
हाँ। New MySQL session सामान्यतः autocommit enabled से शुरू होता है, इसलिए explicit transaction के बाहर हर successful statement commit हो जाती है।
Transactions के लिए कौन-सा MySQL storage engine लें?
InnoDB जैसा transaction-safe engine लें। Nontransactional tables के changes को ROLLBACK पूरी तरह undo नहीं कर सकता।
क्या CREATE TABLE या ALTER TABLE को surrounding DML के साथ rollback कर सकते हैं?
इस पर भरोसा न करें। अनेक DDL statements implicit commit कराती हैं और atomic DDL, transactional DDL नहीं है। Schema पहले बनाएँ।
Money transfer से पहले SELECT FOR UPDATE क्यों उपयोग करें?
यह selected InnoDB rows को COMMIT या ROLLBACK तक lock करता है, इसलिए validation और update के बीच दूसरा transaction balance नहीं बदल सकता।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.