在最近遇到一个需求,需要将对数据表结构的操作(增加字段、删除字段)等用事务做控制。在对这个需求做评估时,考虑到数据表结构操作和数据操作属于不同的级别操作(DML和DDL),就初步回绝了需求。然后又在sqlite中做了以下实验:
begin transaction;
create table test(a int);
insert into test(a) values(1);alter table test add b int;
insert into test values(2,2);
commit transaction;
执行这个语句块,直接报错。提示是:不能在一个事务内开另一个事务。
原因就是,DDL属于隐性提交事务,在执行前数据库内部会开一个事务。但在语句块中已经显式开启了事务,导致内部事务开启失败。