数据操作与事务:确保数据一致性的关键
title: 数据操作与事务:确保数据一致性的关键
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A'; -- 扣款
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B'; -- 存款
-- 检查存款是否成功
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK; -- 撤销扣款
END
ELSE
BEGIN
COMMIT; -- 提交事务
END
IF (SELECT balance FROM accounts WHERE account_id = 'A') < 100
BEGIN
ROLLBACK; -- 如果余额不足,撤销事务
END
BEGIN TRANSACTION;
SELECT * FROM accounts WITH (ROWLOCK) WHERE account_id = 'A';
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
COMMIT;
BEGIN TRANSACTION;
SELECT * FROM accounts WITH (TABLOCK);
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
COMMIT;
-- 事务1
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
-- 尚未提交事务1
-- 事务2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM accounts WHERE account_id = 'A'; -- 事务2可以读取事务1未提交的数据
-- 事务1
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 'A'; -- 读取余额
-- 事务2
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A'; -- 修改余额
COMMIT;
-- 事务1继续
SELECT balance FROM accounts WHERE account_id = 'A'; -- 读取的余额可能会与之前不同
COMMIT;
-- 事务1
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 'A'; -- 第一次读取
-- 事务2
BEGIN TRANSACTION;
INSERT INTO accounts (account_id, balance) VALUES ('B', 100); -- 插入一条新记录
COMMIT;
-- 事务1继续
SELECT balance FROM accounts WHERE account_id = 'A'; -- 保证与第一次读取相同
COMMIT;
-- 事务1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE account_id = 'A';
-- 事务2
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A'; -- 事务2必须等待事务1完成
COMMIT;
评论
发表评论