mysql怎么写事务 mysql怎么实现的事务( 三 )


隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力 , 隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致 。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable) 。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失 。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作 。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION , 或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交 。
from 树懒学堂 - 一站式数据知识平台
如何在mysql 的存储过程中使用事务6.7 MySQL 事务与锁定命令
6.7.1 BEGIN/COMMIT/ROLLBACK 句法
缺省的,MySQL 运行在 autocommit 模式 。这就意味着,当mysql怎么写事务你执行完一个更新时,MySQL 将立刻将更新存储到磁盘上 。
如果你使用事务安全表 (例如 InnoDB、BDB),通过下面的命令 , 你可以设置 MySQL 为非 autocommit 模式mysql怎么写事务:
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 的主要原因是,仿效事务处理或在更新表时得到更快的速度 。此后会有更详细的描述 。

推荐阅读