1. 自动提交的关闭与打开
MySQL默认是打开了自动提交的。关闭自动提交有以下办法
1. Session级别:
使用 START TRANSACTION 或者 BEGIN 来开始一个事务,使用ROLLBACK/COMMIT来结束一个事务。
2. Session级别:
SET autocommit=0关闭当前session的自动提交。
3. 全局级别:
SET GLOBAL autocommit=0关闭全局的自动提交。
shell> mysql test1
mysql> CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));
mysql> START TRANSACTION;
mysql> INSERT INTO customer VALUES (10, 'Heikki');
mysql> COMMIT;
mysql> SET autocommit=0;
mysql> INSERT INTO customer VALUES (15, 'John');
mysql> INSERT INTO customer VALUES (20, 'Paul');
mysql> DELETE FROM customer WHERE b = 'Heikki';
mysql> ROLLBACK;
mysql> SELECT * FROM customer;
+------+--------+
| a | b |
+------+--------+
| 10 | Heikki |
+------+--------+
1 row in set (0.00 sec)
2. 无法被回滚的语句
DDL语句无法被回滚,比如 create database/drop database, create/drop/alter table/routine。
3. 隐式发出commit的语句
有些语句,在执行之前,会隐式地发出commit。这些语句包括:
3.1 DDL语句
3.2 隐式地使用或者修改
mysql
数据库的语句,比如 ALTER USER, CREATE USER, DROP USER, GRANT, RENAME USER, REVOKE, SET PASSWORD
3.3 事务控制和锁语句,比如BEGIN,START TRANSACTION, LOCK/UNLOCK TABLES, SET autocommit = 1(原来不是1)
3.4 LOAD数据语句, LOAD DATA INFILE
3.5 管理语句,比如 ANALYZE TABLE, CACHE INDEX, CHECK TABLE等等
3.6 复制控制语句,比如 START/STOP/RESET SLAVE, CHANGE MASTER TO
mysql> set autocommit=1;
mysql> BEGIN;
mysql> CREATE TABLE T2(ID INT);
mysql> INSERT INTO T2 VALUES(100);
mysql> ROLLBACK;
mysql> SELECT * FROM T2;
+------+
| ID |
+------+
| 100 |
+------+
1 row in set (0.00 sec)
这里之所以已经ROLLBACK了,还是能看到插入了数据,是因为CREATE语句已经隐式地commit了。之后的语句都是自动提交的。
4. SAVEPOINT语法如下:
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
mysql> CREATE TABLE T2(ID INT);
mysql> BEGIN;
mysql> INSERT INTO T2 VALUES(100);
mysql> SAVEPOINT svp1;
mysql> INSERT INTO T2 VALUES(200);
mysql> ROLLBACK TO SAVEPOINT svp1;
mysql> RELEASE SAVEPOINT svp1;
mysql> COMMIT;
mysql> SELECT * FROM T2;
+------+
| ID |
+------+
| 100 |
+------+
1 row in set (0.00 sec)
可以看到,第二条insert语句被rollback了,但第一条是在savepoint之前,没有被rollback.
本文所述内容均在InnoDB存储引擎下。1. 自动提交的关闭与打开MySQL默认是打开了自动提交的。关闭自动提交有以下办法1. Session级别:使用 START TRANSACTION 或者 BEGIN 来开始一个事务,使用ROLLBACK/COMMIT来结束一个事务。2. Session级别:SET autocommit=0关闭当前session的自动提交。3. 全局
MySQL
提供了LOCK TABLES语句来锁定当前线程的表,语法格式如下:
LOCK TABLES
tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
表锁定支持以下类型的锁定。
READ:读锁定,确保用户可以读取表,但是不能修改表。
WRITE:写锁定,只有锁定该表的用户可以修改表,其他用户无法访问该表。加上LOW_PRIORITY后允许其他用户读取表,但是不能修改它。
在对一个事务表使用表锁定的时候需要注意以下几点:
事务隔离级别
在锁定表时会隐式地
提交
所有事务,在开始一个事务时,如START TRANSACTION,会隐式解开所有表锁定。
在事务表
中
,系统变量
AUTO
COMMIT
值必须设为0。否则,
MySQL
会在调用 LOCK TABLES之后立刻释放表锁定,并且很容易形成死锁。
事务隔离级别
【例】 在XS表上设置一个只读锁定。
LOCK TABLES XS READ;
说明:LOCK TABLE
首先两个函数都是用来处理DB 的。首先,
mysql
i 连接是永久连接,而
mysql
是非永久连接。什么意思呢?
mysql
连接每当第二次使用的时候,都会重新打开一个新的进程,而
mysql
i则只使用同一个进程,这样可以很大程度的减轻服务器端压力。其次,
mysql
i封装了诸如事务等一些高级操作,同时封装了DB操作过程
中
的很多可用的方法。应用比较多的地方是
mysql
i的事务。比如下面的示例:复制代码 代码如下:$
mysql
i = new
mysql
i(‘localhost’,’root’,”,’DB_Lib2Test’);$
mysql
i->
auto
commit
(false);//开始事物$mysq
Mysql
的
auto
commit
使用要点
Mysql
的
auto
commit
关于关闭
mysql
auto
commit
属性及transaction事务相关处理和使用要求服务端应用程序客户端工具
Mysql
的
auto
commit
Mysql
中
auto
commit
默认为1开启状态,即sql语句是
自动
提交
的。一段先后关联的sql语句,前面的部分sql执行成功已被
自动
提交
,如果
中
间或后面的部分sql出现执行失败的状况,就会导致前后事务不一致,数据出现了不一致的情况。
auto
commit
和 start transact
简单介绍下
auto
commit
参数,下文内容只在Innodb引擎下有效,因为Innodb支持事务,MyISAM不支持
环境:
mysql
8(innodb),mac M1
一、
auto
commit
参数是一个客户端参数,或者说是连接参数。
为了演示
auto
commit
参数的效果,这里创建两个连接,两个连接的是我本地的同一个数据库,只是连接名不同。
1、查询当前连接的
auto
commit
参数
show variables like "
auto
commit
"
另一个连接的
auto
commit
的值也是ON,因
MySQL
的
自动
提交
功能
在
MySQL
中
执行命令时,通常都直接被确定
提交
了。也就是说用户不用意识此事,所有的命令都会被
自动
COMMIT
。特别是当存储引擎为MyISAM的情况下,本身它是不支持事务处理的,只要执行了命令,所有的命令部会被
提交
。
这样的默认
自动
提交
的功能就被称为
自动
提交
功能。
自动
提交
功能默认被置为ON的状态。但是,如果存储引擎为InnoDB (Default)时,当执行了START TRANSACTION或BEGIN命令(
MySQL
事务处理-删除后回滚)后,将不会
自动
提交
了,只有明确执行了COM
mysql
的
auto
commit
选项
auto
commit
生效范围事务不使用事务更改
auto
commit
配置更改配置文件热更改配置应用程序更改配置
auto
commit
生效范围
不使用事务
更改
auto
commit
配置
更改配置文件
热更改配置
应用程序更改配置
答:以下是将数据
自动
录入
MySQL
云服务器的Python代码:import py
mysql
# Connect to the database
connection = py
mysql
.connect(host='localhost',
user='user',
password='passwd',
db='database',
charset='utf8mb4',
cursorclass=py
mysql
.cursors.DictCursor)try:
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO `table` (`column1`, `column2`, `column3`) VALUES (%s, %s, %s)"
cursor.execute(sql, ('value1', 'value2', 'value3')) # connection is not
auto
commit
by default. So you must
commit
to save
# your changes.
connection.
commit
()finally:
connection.close()