# Transaction

## Introdunction

The transaction function realizes that DML statements are submitted in batches to improve the execution efficiency of large batches of DML statements and ensure transaction consistency (`in the same batch`).

The following details the configuration method and the rollback differences involved.

## Config

Add the parameter `--trans=?` when calling goInception, where the parameter value is a number,
* The default is 0, that is, do not open the transaction (commit row by row)
* When it is greater than 1, it will be submitted in batches according to this parameter, such as 500, it will be submitted once according to 500 DML


### Demo
```py

import pymysql

sql = '''/*--host=127.0.0.1;--port=3306;--user=test;--password=test;\
--execute=1;--backup=1;--ignore-warnings=1;--trans=100;*/
inception_magic_start;
use test_inc;

-- drop table if exists t1;
create table t1 (id int primary key,c1 int ,c2 varchar(100));

insert into t1 values(1,2,'ccc');
insert into t1 values(2,2,'ccc');
insert into t1 values(3,3,'ccc');
insert into t1 values(4,2,'ccc');
insert into t1 values(5,2,'ccc');

inception_magic_commit;'''

conn = pymysql.connect(host='127.0.0.1', user='', passwd='',
                       db='', port=4000, charset="utf8mb4")
cur = conn.cursor()
ret = cur.execute(sql)
result = cur.fetchall()
cur.close()
conn.close()

for row in result:
    print(row)
```

## Execute

* Commit row by row before opening the transaction
* After opening the transaction, submit according to the set number. If set to 500, 500 DMLs will be submitted once
* DDL execution is not affected by the transaction function, and like MySQL, it is independent of a transaction
* When the transaction fails to commit, it will `roll back the batch of SQL` and terminate it immediately (all executed SQL will generate a rollback statement, so that it can be rolled back quickly if necessary)

If there are DDL statements in the transaction, DML will be automatically submitted, so `mixing DDL and DML will not affect this function`.