MySQL 事务与锁定命令

MySQL 定命令
6.7. 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 TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP TABLE
RENAME 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 是地,你必 须锁 定所有你将使用的表,并且必 使用与你的 查询 中将使用的 名相同!如果你在一个 查询 中多次使用一个表 ( ) ,你必 须为每 一个 得一个
WRITE READ 有更高的 限,以确保更新被尽快地 理。 就意味着,如果 一个 线 得一个 READ ,而同 另外一个 线 求一个 WRITE ,并 READ 锁请 求将等待直到 WRITE 线 程得到了 放了它。你可以使用 LOW_PRIORITY WRITE ,当 该线 程在等待 WRITE 锁时 ,它将允 其它的 线 READ 应该 只使用 LOW_PRIORITY WRITE ,如果你确信 将是最后一次,当没有 线 程将 READ
LOCK TABLES 工作如下:
  1. 以内部定的次序排序所有被定的表 (从用场说次序是不明确的)
  2. 如果一个表被以一个读锁和一个写锁锁定,将写放在读锁之前。
  3. 一次只定一个表,只到线程得到所有的定。
个方案是 了确保,表 定死 锁释 放。 个模式你仍然有些其它事情需要知道:
如果你 一个表使用一个 LOW_PRIORITY WRITE 定, 就意味着, MySQL 将等待 ,直到没有 线 求一个 READ 。当 线 程得到了 WRITE ,并等待 定表列表中的下一个表的 ,其它所有的 线 程将等待 WRITE 放。 如果 在你的 用程序中会引起一个 重的 问题 ,你 应该 将你的某些 转换为 安全表。
你可以使用 KILL 安全地 死一个正在表 定的 线 程。 看章 4.5.5 KILL 句法
注意,你不 应该 定你正在 其使用 INSERT DELAYED 的表。 是因 ,在 这种 情况下, INSERT 是通 过单 独的 线 程完成的。
通常,你不需要 定任何表,因 所有 UPDATE 句都是原子的;其它的 线 程无法干 当前 行的 SQL 句。当你无 如何希望 定表 里有一些情况:
  • 如果你在一束表上运行多操作,定你将要使用的表,会更快一些。当然有不利的方面,其它线程将不能更新一个READ的表,并且没有其它线程要以取一个WRITE的表。LOCK TABLES下,某些事运行得更快一些的原因是,MySQL 将不会转储清除被定表高速冲,直到UNLOCK TABLES (通常高速冲在 SQL 句后都会被转储清除)将加速在MyISAM表上的插入、更新、除。
  • 如果你在 MySQL 中正在使用一个不支持事的存引擎,如果你希望能确保没有其它的线程会出在一个SELECT一个UPDATE,你必使用LOCK TABLES。下面的示例了安全地行,里需要LOCK TABLES
·                mysql> LOCK TABLES trans READ, customer WRITE;
·                mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
·                mysql> UPDATE customer SET total_value=sum_from_previous_statement
·                    ->        WHERE customer_id=some_id;
·                mysql> UNLOCK TABLES;
不使用 LOCK TABLES ,将可能 生在 SELECT UPDATE 行期 有另外一个 线 程可能在 trans 表中插入一行新 记录
使用 增更新 ( UPDATE customer SET value=value+new_value ) LAST_INSERT_ID() 函数,你可以在很多情况下避免使用 LOCK TABLES
你也可以使用用 户级锁 定函数 GET_LOCK() RELEASE_LOCK() 解决一些情况, 被保存在服 器上的一个哈希表中,并以 pthread_mutex_lock() pthread_mutex_unlock() 实现 得高速度。 看章 6.3.6.2 辅助功能函数
看章 5.3.1 MySQL 如何锁定表 ,以 定方案的更多信息。
你可以使用 FLUSH TABLES WITH READ LOCK 命令以 读锁锁 定所有数据 中的所有表。 看章 4.5.3 FLUSH 句法 。如果你有一个可以及 建立文件快照的文件系 ,例如 Veritas 将是得到 份的非常方便方式。
注意: LOCK TABLES 不是事 安全的,在 尝试锁 定一个表之前,将自 地提交所有的活
6.7.3 SET TRANSACTION 句法
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
置全局的、整个会 或下一个事 的事 隔离
缺省行 置下一个 ( 未启 ) 的隔离 。如果你使用 GLOBAL 关键词 所有在那个点上建立的新 置默 的全局事 隔离 这样 做,你需要有 SUPER 限。使用 SESSION 关键词为 当前 接所有将来 行的事 务设 置默 的事 隔离
你可以使用 --transaction-isolation=... mysqld 置默 的全局隔离 看章 4.1.1 mysqld 命令行选项
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值