mysql怎么结束事务 mysql终止事务

如何在mysql 的存储过程中使用事务6.7 MySQL 事务与锁定命令
6.7.1 BEGIN/COMMIT/ROLLBACK 句法
缺省的,MySQL 运行在 autocommit 模式 。这就意味着,当你执行完一个更新时,MySQL 将立刻将更新存储到磁盘上 。
如果你使用事务安全表 (例如 InnoDB、BDB),通过下面的命令,你可以设置 MySQL 为非 autocommit 模式:
SET AUTOCOMMIT=0
在此之后,你必须使用 COMMIT 来存储你的更改到磁盘上,或者使用 ROLLBACK ,如果你希望忽略从你的事务开始所做的更改 。
如果你希望为一系列语句从 AUTOCOMMIT 模式转换 , 你可以使用 START TRANSACTION 或 BEGIN 或 BEGIN WORK 语句:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
START TRANSACTION 在 MySQL 4.0.11 中被加入;这是被推荐的开始一个特别(ad-hoc)事务的方式 , 因为这是 ANSI SQL 句法 。
注意 , 如果你使用的是一个非事务安全表,更改会立刻被存储 , 不受 autocommit 模式状态的约束 。
当你更新了一个非事务表后,如果你执行一个 ROLLBACK,你将得到一个错误 (ER_WARNING_NOT_COMPLETE_ROLLBACK) 作为一个警告 。所有事务安全表将被恢复 , 但是非事务安全表将不会改变 。
如果你使用 START TRANSACTION 或 SET AUTOCOMMIT=0,你应该使用 MySQL
二进制日志做备份以代替老的更新日志 。事务处理被以一个大块形式存储在二进制日志中 , 在 COMMIT
上面,为了保护回滚的事务,而不是被存储的 。查看章节 4.9.4 二进制日志 。如果您使用起动事务处理或集AUTOCOMMIT=0
,您应该使用MySQL 二进制日志为备份代替更旧的更新日志 。事务处理存储在二进制登录一大块,做,保证, 滚的事务处理不存储 。参见部分4
。9.4 二进制日志 。
下列命令自动的结束一个事务 (就好像你在执行这个命令之前 , 做了一个 COMMIT):
命令命令命令
ALTER TABLEBEGINCREATE INDEX
DROP DATABASEDROP TABLERENAME TABLE
TRUNCATE
你可以使用 SET TRANSACTION ISOLATION LEVEL ... 改变事务的隔离级 。查看章节 6.7.3 SET TRANSACTION 句法 。
6.7.2 LOCK TABLES/UNLOCK TABLES 句法
LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
LOCK TABLES 为当前线程锁定表 。UNLOCK TABLES 释放当前线程拥有的所有锁定 。当线程发出另一个 LOCK TABLES,或当与服务器的连接被关闭时 , 被当前线程锁定的所有表将被自动地解锁 。
为了在 MySQL 4.0.2 使用 LOCK TABLES,你必须拥有一个全局的 LOCK TABLES 权限和一个在相关表上的
SELECT 权限 。在 MySQL 3.23 中,你对该表需要有 SELECT、insert、DELETE 和 UPDATE 权限 。
使用 LOCK TABLES 的主要原因是 , 仿效事务处理或在更新表时得到更快的速度 。此后会有更详细的描述 。
如果一个线程在一个表上得到一个 READ 锁,该线程 (和所有其它线程) 只能从表中读取 。如果一个线程在一个表上得到一个 WRITE 锁 , 那么只有拥有这个锁的线程可以从表中读取和写表 。其它的线程被阻塞 。
READ LOCAL 和 READ 之间的不同就在于,当锁被加载时,READ LOCAL 允许非冲突(non-conflicting) INSERT 语句执行 。如果当你加载着锁时从 MySQL 外部操作数据库文件 , 这将仍不能被使用 。
当你使用 LOCK TABLES 是地,你必须锁定所有你将使用的表,并且必须使用与你的查询中将使用的别名相同!如果你在一个查询中多次使用一个表(用别名),你必须为每一个别名获得一个锁 。

推荐阅读