mysql怎么使用事务 mysql事务命令( 七 )


为了解决数据库并发控制问题,如走到同一时刻客户端对同一张表做更新或者查询操作,需要对并发操作进行控制 , 因此产生了锁
共享锁的粒度是行或者元组(多个行),一个事务获取了共享锁以后,可以对锁定范围内的数据执行读操作
排他锁的粒度与共享锁相同,一个事务获取排他锁以后,可以对锁定范围内的数据执行写操作
有两个事务 A 和 B,如果事务 A 获取了一个元组的共享锁 , 事务 B 还可以立即获取这个元组的共享锁 , 但不能获取这个元组的排他锁 , 必须等到事务 A 释放共享锁之后 。如果事务 A 获取了一个元组的排他锁,事务 B 不能立即获取这个元组的共享锁 , 也不能立即获取这个元组的排他锁,必须等到 A 释放排他锁之后
意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁和意向排他锁 。意向共享锁表示一个事务有意对数据上共享锁或者排他锁 。有意表示事务想执行操作但还没真正执行
锁的粒度主要分为表锁和行锁
表锁的开销最小,同时允许的并发量也是最小 。MyISAM 存储引擎使用该锁机制 。当要写入数据时,整个表记录被锁,此时其他读/写动作一律等待 。一些特定的动作,如 ALTER TABLE 执行时使用的也是表锁
行锁可以支持最大的并发,InnoDB 存储引擎使用该锁机制 。如果要支持并发读/写,建议采用 InnoDB 存储引擎
如何在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;
【mysql怎么使用事务 mysql事务命令】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 句法 。