暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL_事务

lin在路上 2020-08-18
768

业务场景往往需要针对多张表同时进行操作(比如转账业务包括A账户减少、B账户增加、转账明细记录),为了保证数据库的完整性,必须确保这三个操作要么都成功、要么都失败,若出现部分成功部分失败,将导致数据库数据出现紊乱。而为了避免这个问题的出现,就需要事务处理来实现。

1 事务

  • 并非所有引擎都支持事务处理,比如常见的执行引擎中MyISAM不支持,InnoDB支持

  • 事务特点

    • 原子性,事务是最小单位,不可再分

    • 一致性,同一事务中的DML操作(事务支持DML操作,包括INSERT,UPDATE,DELETE),必须保证同时成功或同时失败

    • 隔离性,不同事务之间具有隔离性

    • 持久性,事务提交之后对系统的影响是永久的

2 操作

事务主要操作有两种:ROLLBACK(回滚,撤销当前操作)和COMMIT(提交当前操作)。

2.1 ROLLBACK(回滚)

 CREATE TABLE IF NOT EXISTS account (acct_num INT, amount DECIMAL(10,2));
 CREATE TABLE IF NOT EXISTS account_records(acct_num INT,records INT);
 TRUNCATE TABLE account;
 TRUNCATE TABLE account_records;
 -- 创建表(若表不存在)并清空
 
 INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
 INSERT INTO account_records VALUES(137,1),(141,1),(97,1);
 -- 插入数据
 
 SELECT * FROM account;
 SELECT * FROM account_records;
 -- 事务执行前数据情况
 
 START TRANSACTION;
 DELETE FROM account;
 DELETE FROM account_records;
 ROLLBACK;
 -- 执行表清空操作之后回滚
 -- START TRANSACTION用于表示事务的开始,ROLLBACK表示事务回滚
 
 SELECT * FROM account;
 SELECT * FROM account_records;
 -- 验证事务回滚情况
复制

2.2 COMMIT(提交)

 CREATE TABLE IF NOT EXISTS account (acct_num INT, amount DECIMAL(10,2));
 CREATE TABLE IF NOT EXISTS account_records(acct_num INT,records INT);
 TRUNCATE TABLE account;
 TRUNCATE TABLE account_records;
 -- 创建表(若表不存在)并清空
 
 INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
 INSERT INTO account_records VALUES(137,1),(141,1),(97,1);
 -- 插入数据
 
 SELECT * FROM account;
 SELECT * FROM account_records;
 -- 事务执行前数据情况
 
 START TRANSACTION;
 DELETE FROM account;
 DELETE FROM account_records;
 COMMIT;
 -- 执行表清空操作之后提交
 -- START TRANSACTION用于表示事务的开始,COMMIT表示事务提交
 
 SELECT * FROM account;
 SELECT * FROM account_records;
 -- 验证事务提交情况
复制



文章转载自lin在路上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论