展开全部

6.7 MySQL 事务与锁定命令

6.7.1 BEGIN/COMMIT/ROLLBACK 句法

缺省的,MySQL 运行在 autocommit 模式。这就意味着,当你执行完一e69da5e887aa62616964757a686964616f31333361326265个更新时,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 工作如下:

以内部定义的次序排序所有被锁定的表 (从用户立场说,该次序是不明确的)。

如果一个表被以一个读锁和一个写锁锁定,将写锁放在读锁之前。

一次只锁定一个表,只到线程得到所有的锁定。

这个方案是为了确保,表锁定死锁释放。 对于这个模式你仍然有些其它事情需要知道:

如果你对一个表使用一个 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 命令行选项

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

mysql 存储 事务_MYSQL 可以在存储过程里实现事务控制吗相关推荐

  1. mysql maria引擎_MySQL/mariadb知识点——存储过程及存储引擎

    MySQL架构 连接器 连接池,安全认证.线程池.连接限制.检查内存.缓存 SQL接口 DML.DDL SQL解析器,对SQL语句的权限检查.解析为二进制程序 优化器,优化访问路径 缓存cache,b ...

  2. Mysql存储级别_mysql 存储引擎分类和事务隔离级别

    mysql 存储引擎分类 myisam和innodb的区别 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条S ...

  3. mysql 存储引擎_MySQL存储引擎

    数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特定 ...

  4. 简述mysql 存储引擎_Mysql基础-存储引擎简述

    说明:Mysql服务器提供了丰富的存储引擎供我们选择,并且给我们提供了足够的可配性,完全可以根据实际需要实现自定义. Mysql 的存储引擎介绍 在数据库中存的就是一张张有着千丝万缕关系的表,所以表设 ...

  5. mysql 存储汉字_MySQL存储汉字

    Python基础面向对象成员 面向对象中成员 字段: 静态字段保存在类中:静态字段在代码加载时被创建 普通字段保存在对象中: 规则: 普通字段只能用对象访问: 静态字段用类去访问(万不得已的时候可以使 ...

  6. mysql存储树结构_mysql 树形结构查询(存储过程)

    就用数据数据库表地址数据(中国地区) 来说吧(用Windows 请使用 gbk !!) 可直接运行(去除注解) 存储过程: DELIMITER//dropprocedureifexistsfindLC ...

  7. mysql存储加速_mysql存储过程加速

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 首先看一个存储过程,这个存储过程是为了构造数据使用的.当然贴出来的存储过程简化了一些不必要的表结构. CREATE PRO ...

  8. mysql 视图用户_MySQL视图,存储过程,用户管理

    1. 视图 一张虚拟表,就是将一个经常被使用的查询作为一个虚拟表,开发者查询的时候不需要再次书写SQL,而是直接调用对应的视图就可,调用视图以后MySQL会执行这个查询SQL. # 创建视图 crea ...

  9. mysql 创建函数_MySQL函数,存储过程,用户管理

    1. 视图 一张虚拟表,就是将一个经常被使用的查询作为一个虚拟表,开发者查询的时候不需要再次书写SQL,而是直接调用对应的视图就可,调用视图以后MySQL会执行这个查询SQL. # 创建视图 crea ...

最新文章

  1. Haproxy+Keepalived实现网站双主高可用-理论篇
  2. AVL树C++实现(插入,删除,查找,清空,遍历操作)
  3. 如何优化增强第三方库?
  4. Laravel 清空配置缓存
  5. Python 根据文件绝对路径删除文件
  6. java项目中用了Disruptor之后,性能提升了10倍
  7. biee12c连接hive_BIEE 12c Linux下连接Hadoop Hive
  8. C# (正则表达试) 检查是否为IP地址
  9. Windows Server 2016 配置指南 之 安装 PHP redis 拓展
  10. Android判断App是否在前台运行
  11. 1.mongoDB 简介
  12. 海康Ehome协议java开发
  13. idea的下载与安装破解
  14. java 拖拉机_Java——io流
  15. javaee实训报告总结_javaee实训总结
  16. CTA认证system_process定位联网未明示问题
  17. 类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...
  18. Business English-Unit 4 Memos -A
  19. template和template
  20. 《把时间当作朋友》第1章读后感(一)

热门文章

  1. CentOS服务器上部署 oracle10gr2
  2. java long类型转string_JavaSE的学习——数据类型
  3. virsh 关机_kvm虚拟机不能使用virsh shutdownw命令关闭虚拟机的解决方法
  4. Error(6,35)java: 程序包 不存在,解决办法
  5. linux安装mysql不成功怎么处理_Linux上安装MySQL时出现不兼容的解决办法
  6. Javascript对象及数组用法笔记
  7. 玩转 Tomcat 配置必备的 10 个小技巧!
  8. 培养这10个习惯,你就离UNIX高手更进一步了
  9. 数据库的那些事(全是干货)
  10. npz文件转为npy_numpy的文件存储 .npy .npz 文件