记一次MySql手动开启事物的过程
最近因为需要通过SQL导入一批外部数据,在SQL的编写阶段为了不在数据库产生垃圾数据,用到了MySql中InnoDB存储引擎的事物特性。
MySql版本:select version();
MySql当前会话隔离级别:select @@tx_isolation;
MySql当前存储引擎:show variables like '%storage_engine%';
首先创建数据表(可选),如果有了略过------不是重点:
mysql> SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tbl_file_biz
-- ----------------------------
DROP TABLE IF EXISTS `tbl_file_biz`;
CREATE TABLE `tbl_file_biz` (
`id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '主键id',
`biz_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '业务id',
`biz_type` varchar(8) COLLATE utf8mb4_bin NOT NULL COMMENT '业务类型(01 电子合同,02营业执照,03协议...根据自己的业务去添加)',
`file_name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '附件上传名',
`file_url` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '附件地址',
`create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '添加人',
`create_time` datetime NOT NULL COMMENT '新增时间',
`update_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '修改人',
`update_time` datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='附件表 —— 彦彪';
SET FOREIGN_KEY_CHECKS = 1;
接下来是重头戏:
-- 设置事物自动提交
set @@autocommit=0;
SHOW VARIABLES like '%autocommit%';
-- 开启事物
START transaction ;
-- insert一条测试数据
insert into tbl_file_biz ( biz_id, biz_type, file_name, file_url, create_user, create_time, update_user, update_time )
values
("C643898313145335808",10, "测试一下事物", "测试一下事物.com", "A621367679420219392", now(), "A621367679420219392", now() );
-- 此时能查处一条记录
SELECT * FROM tbl_file_biz where cooperator_id = 'C643898313145335808';
-- 回滚不提交
ROLLBACK;
-- 此时不能查处一条记录
SELECT * FROM tbl_file_biz where cooperator_id = 'C643898313145335808';
-- 提交事物
COMMIT;
-- 恢复事物自动提交
set @@autocommit=1;
SHOW VARIABLES like '%autocommit%';
其他:
-- 查询 正在执行的事务:
SELECT * FROM information_schema.INNODB_TRX;
-- 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-- 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
show processlist;