1.手动commit,rollback
-- 开启事务
START TRANSACTION;
-- 关闭自动提交
SET autocommit = 0;
-- 要执行的sql
INSERT INTO `t_bank_organ_copy1`
VALUES
( 1, 975, '06285', '中国银行苏州分行', 1, 'root', '2022-05-10 17:55:46', 'root', '2022-05-10 17:55:46' );
INSERT INTO `t_bank_organ_copy1`
VALUES
( 2, 971324123423412345, '06286', '中国银行苏州姑苏支行', 1, 'root', '2022-05-10 17:55:46', 'root', '2022-05-10 17:55:46' );
-- 提交
COMMIT;
-- 回滚
ROLLBACK;
-- 恢复自动提交
SET autocommit = 1;
当sql没有错误时,所有sql被执行。数据被添加
> Affected rows: 1
> 时间: 0.136s
INSERT INTO `t_bank_organ_copy1`
VALUES
( 2, 971324123423412345, '06286', '中国银行苏州姑苏支行', 1, 'root', '2022-05-10 17:55:46', 'root', '2022-05-10 17:55:46' )
> 1264 - Out of range value for column 'organ_no' at row 1
> 时间: 0.14s
当 sql出错时,会停止在报错的语句处;
此时sql处于未提交状态,并且未开启自动提交(未执行到commit),需要手动决定下一步的操作。
如果想要把成功的数据放进数据库中,就执行conmmit语句。并且把自动提交置回1;
如果要保证全部成功,失败后就要回滚。就执行rollback语句;并且在回滚后吧自动提交置回1;
2.函数执行,报错后回滚
-- 新建函数
CREATE DEFINER=`vszerp`@`%` PROCEDURE `proc`( )
BEGIN
-- 设置变量为false
DECLARE
hasSqlError INT DEFAULT FALSE;
-- 当出现sql错误时候置为true
DECLARE
CONTINUE HANDLER FOR SQLEXCEPTION
SET hasSqlError = TRUE;
START TRANSACTION;
-- 要执行的sql
INSERT INTO `t_bank_organ_copy1`
VALUES
( 1, 975, '06285', '中国银行苏州分行', 1, 'root', '2022-05-10 17:55:46', 'root', '2022-05-10 17:55:46' );
INSERT INTO `t_bank_organ_copy1`
VALUES
( 2, 971324123423412345, '06286', '中国银行苏州姑苏支行', 1, 'root', '2022-05-10 17:55:46', 'root', '2022-05-10 17:55:46' );
-- 如果变量是true就回滚
IF
hasSqlError THEN
ROLLBACK;
-- 否则提交
ELSE COMMIT;
-- 关闭if;关闭
END IF;
END
成功失败后都不会给提示,成功后数据库有数据,失败数据库没有数据。
3. 自增id处理
如果是字典值全部添加的sql,并且是自增id时候,sql脚本出错后应该还原id从1开始
// 数据库表中id自增时候普通删除,id会顺序增加,执行truncate table t_name 后数据做删除处理,并且id从1开始自增
truncate table t_name;