mysql的事务控制

要显式地开启一个事务须使用命令BEGIN或START TRANSACTION,或者执行命令SET AUTOCOMMIT=0,以禁用当前会话的自动提交。

事务控制语句:


命令


含义


开启事务


BEGIN


不能用于存储过程


显示地开启事务


BEGIN  WORK


START  TRANSACTION


提交事务


COMMIT


提交事务,并使已对数据库进行的所有修改称为永久性,COMMIT与COMMIT WORK几乎是等价的。


COMMIT  WORK


回滚事务


ROLLBACK


回滚用户的事务,并撤销正在进行的所有未提交的事务。ROLLBACK 与ROLLBACK WORK几乎是等价的。


ROLLBACK  WORK


保存点


SAVEPOINT  identifier


一个事务中可以有多个SAVEPOINT


删除事务保存点


RELEASE  SAVEPOINT identifier


删除一个事务的保存点,当没有一个保存点执行这句语句时,会抛出一个错误。


回滚事务到标记点


ROLLBACK  TO [SAVEPOINT] identifier


与SAVEPOINT命令一起使用,可以把事务回滚到标记点,而不会滚在此标记点之前的任何工作。


设置事务隔离级别


SET TRANSACTION


INNODB存储引擎提供的事务隔离级别READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLLE

在存储过程中,mysql数据库的分析器会自动将BEGIN识别为BEGIN...END,因此在存储过程中只能使用START TRANSACTION语句来开启一个事务。

COMMIT和COMMIT WORK语句基本上是一致的。不同之处在于COMMIT WORK用来控制事务结束后的行为是CHAIN还是RELEASE。


Value


Description


NO_CHAIN(or 0)


COMMIT and ROLLBACK are unaffected. This is the default value.


CHAIN (or 1)


COMMIT and ROLLBACK are equivalent to COMMIT AND CHAIN and ROLLBACK AND CHAIN, respectively. (A new transaction starts  immediately with the same isolation level as the just-terminated  transaction.)


RELEASE(or 2)


COMMIT and ROLLBACK are equivalent to COMMIT RELEASE and ROLLBACK RELEASE, respectively. (The server disconnects  after terminating the transaction.)

(1)set completion_type=0

可以通过参数completion_type来进行控制,default为0或NO_CHAIN,表示没有任何操作。

mysql>show variables like ‘completion_type‘;

+-----------------+----------+

|Variable_name   | Value    |

+-----------------+----------+

|completion_type | NO_CHAIN |

+-----------------+----------+

1 row inset (0.00 sec)

(2)set completion_type=1

mysql> select @@autocommit;

+--------------+

| @@autocommit |

+--------------+

|            1 |

+--------------+

1 row in set (0.00 sec)

创建表test

droptable if exists t;

create tablet(id int primary key)engine=innodb;

setcompletion_type=1;

begin;

insertinto t select 1;

commitwork;

insertinto t select 2;

insertinto t select 2;

ERROR1062 (23000): Duplicate entry ‘2‘ for key ‘PRIMARY‘

mysql>rollback;

Query OK,0 rows affected (0.00 sec)

mysql>select * from t;

+----+

| id |

+----+

|  1 |

+----+

1 row inset (0.00 sec)

分析:completion_type=1时,第一次通过commit work来插入1这个记录,之后并没有显式地开始一个事务,当抛出异常时,执行rollback操作,只有一条记录插入,另一条没有插入。这是因为当completion_type=1时,commit work自动开启了一个链事务,直到rollback操作都属于一个事务,因此在回滚后,后面插入的记录都没有存在表中。

(2)set completion_type=2

当setcompletion_type=2时,COMMIT WORK等同于COMMIT RELEASE。当事务提交后自动断开与服务器的连接。

mysql>set completion_type=2;

Query OK,0 rows affected (0.00 sec)

mysql>begin;

Query OK,0 rows affected (0.00 sec)

mysql>insert into t select 3;

Query OK,1 row affected (0.00 sec)

Records:1  Duplicates: 0  Warnings: 0

mysql>commit work;

Query OK,0 rows affected (0.01 sec)

mysql>select schema();

ERROR2006 (HY000): MySQL server has gone away

Noconnection. Trying to reconnect...

Connectionid:    96

Currentdatabase: tpch

+----------+

|schema() |

+----------+

| tpch     |

+----------+

1 row inset (0.02 sec)

mysql>begin;

Query OK,0 rows affected (0.00 sec)

mysql>insert into t select 5;

Query OK,1 row affected (0.00 sec)

Records:1  Duplicates: 0  Warnings: 0

mysql> commit release;

Query OK,0 rows affected (0.00 sec)

savepoint

a、对于不存在的SVAEPOINT,如果回滚,会抛出异常

mysql>rollback to t1;

ERROR1305 (42000): SAVEPOINT t1 does not exist

mysql>rollback to savepoint t1;

ERROR1305 (42000): SAVEPOINT t1 does not exist

b、在事务中,一条语句的失败并抛出异常并不会导致先前已经执行的语句自动回滚,必须由用户来决定是否对其进行提交或回滚操作。

commit操作:

mysql>set completion_type=0;

Query OK,0 rows affected (0.00 sec)

mysql>truncate table t;

Query OK,0 rows affected (0.04 sec)

mysql>begin;

Query OK,0 rows affected (0.00 sec)

mysql>insert into t select 1;

Query OK,1 row affected (0.00 sec)

Records:1  Duplicates: 0  Warnings: 0

mysql>insert into t select 1;

ERROR1062 (23000): Duplicate entry ‘1‘ for key ‘PRIMARY‘

mysql>select * from t;

+----+

| id |

+----+

|  1 |

+----+

1 row inset (0.00 sec)

mysql>commit;

Query OK,0 rows affected (0.00 sec)

mysql>select * from t;

+----+

| id |

+----+

|  1 |

+----+

1 row inset (0.00 sec)

mysql>

ROLLBACK操作:

mysql>truncate table t;

Query OK,0 rows affected (0.03 sec)

mysql>select * from t;

Empty set(0.00 sec)

mysql>begin;

Query OK,0 rows affected (0.01 sec)

mysql>insert into t select 5;

Query OK,1 row affected (0.00 sec)

Records:1  Duplicates: 0  Warnings: 0

mysql>insert into t select 5;

ERROR1062 (23000): Duplicate entry ‘5‘ for key ‘PRIMARY‘

mysql>select * from t;

+----+

| id |

+----+

|  5 |

+----+

1 row inset (0.00 sec)

mysql>rollback;

Query OK,0 rows affected (0.00 sec)

mysql>select * from t;

Empty set(0.00 sec)

c、执行返回到保存点操作之后,还需要显式地提交,才真正结束一个事务

也即在执行ROLLBACKTO SAVEPOINT identified之后,还需要运行COMMIT或者ROLLBACK命令才算真正结束该事务。

mysql>select * from t;

Empty set(0.00 sec)

mysql>begin;

Query OK,0 rows affected (0.00 sec)

mysql>insert into t select 10;

Query OK,1 row affected (0.00 sec)

Records:1  Duplicates: 0  Warnings: 0

mysql>savepoint sp1;

Query OK,0 rows affected (0.00 sec)

mysql>insert into t select 20;

Query OK,1 row affected (0.00 sec)

Records:1  Duplicates: 0  Warnings: 0

mysql>savepoint sp2;

Query OK,0 rows affected (0.00 sec)

mysql>select * from t;

+----+

| id |

+----+

| 10 |

| 20 |

+----+

2 rows inset (0.00 sec)

mysql>rollback to savepoint sp1;

Query OK,0 rows affected (0.00 sec)

mysql>select * from t;

+----+

| id |

+----+

| 10 |

+----+

1 row inset (0.00 sec)

mysql>rollback;

Query OK,0 rows affected (0.00 sec)

mysql>select * from t;

Empty set(0.00 sec)

mysql>

在回滚到某个保存点时,事务并没有结束,再运行ROLLBACK命令,事务才会完整地回滚。也就是说rollback to savepoint并不真正的结束事务。

时间: 2024-11-14 12:04:46

mysql的事务控制的相关文章

mysql数据库事务详细剖析

在写之前交代一下背景吧! 做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql.oracle.我这块就主要解释一下mysql数据库事务.其实好多内容适用于各种标准数据库! 直接就进入正文了! 不管是做啥都有理论知识,我在这块也介绍一下. 事务的特性 1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 2.一致性(Consistency):在一个事务中,事务前后数

Mysql锁机制和事务控制

如何加锁 锁定表的语法:    LOCK TABLES    tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}    [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...解锁语法:    UNLOCK TABLES innodb的存储引擎提供行级锁,支持共享锁和排他锁两种锁定模式,以及四种不同的隔离级别. 死锁 InnoDB自动检测事务的死锁,并回滚一个

php中对MYSQL操作之事务控制,回滚

<?php //事务控制,回滚 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名"); //判断是否链接成功 if($mysqli->connect_error){ die($mysqli->connect_error); } //由于在事务提交中系统默认提交,故这里设置为FALSE先不提交 $mysqli->autocomm

MySql命令行控制事务

新建表t1 CREATE TABLE `t1` (   `a` int(11) NOT NULL,   `b` int(11) DEFAULT NULL,   PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 查看mysql系统级别的事务隔离级别: mysql> SELECT @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +--

14.Mysql事务控制和锁定

14.事务控制和锁定存储引擎和锁: MyISAM和MEMORY存储引擎的表支持表级锁: BDB存储引擎的表支持页级锁: InnoDB存储引擎的表支持行级锁.默认情况下,表锁和行锁都是根据执行的语句自动获得和释放,不需要额外处理.用户也可根据业务需要来手动添加和释放锁,以保证事务的完整性. 14.1 Lock table和Unlock tableLock table可以锁定用于当前线程的表.如果表被其他线程锁定,则当前线程会等待,直到可以获取所需的锁定为止.Unlock table可以释放当前线程

Spring MVC一事务控制问题

在最近一个项目中用了Spring MVC作为控制层框架,但却出现了一个让人很费解的问题:事务控制. Spring MVC的配置文件名为:springMVC-servlet.xml,内容如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http:/

(8)Spring的事务控制

程序的"事务控制", 可以用aop实现! 即,只需要写一次,运行时候动态植入到业务方法上. Spring提供了对事务的管理. 1.事务控制概述 用户访问-->Action --> Service --> Dao 一个业务操作的成功: 调用的service是执行成功的,意味着service中调用的所有的dao是执行成功的. 因此事务应该在Service层统一控制. 1.1.编程式事务控制 自己手动控制事务,就叫做编程式事务控制.这属于细粒度的事务控制: 可以对指定的方法

Java实战之03Spring-05Spring中的事务控制(基于AOP)

五.Spring中的事务控制(基于AOP) 1.Spring中事务有关的接口 1.1.明确: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案 1.2.Spring事务管理主要包括3个接口 1.2.1.PlatformTransactionManager事务管理器 具体实现类: 1.2.2.TransactionDefinition事务定义信息 事务的隔离级别: 事务的传播行为:有时面试会问到 REQUIRED:如果当前没有事务,就新建一个事务

JDBC事务控制

JDBC事务控制事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功.例如转账,一方多了,一方少了同时执行.mysql数据库默认事务是自动提交的,即一条SQL语句就是一个单独的事务,是自动提交的.Oracle数据库默认是事务不是自动提交的,没一句都需要手动提交事务,否则默认为都是同一个事务.对于多条sql放在同一个事务中需要使用事务命令start transaction 开启事务(所有增删改查都在临时表中进行) Rollback 回滚事务(取消操作) Commit 提交事