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;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐