执行事务

mysql cookbook00015

执行事务

15.0 引言
因为采取多线程方式,MYSQL服务器可以同时处理多个客户端。为了解决客户端冲突问题,服务器执行必要的锁定操作以确保两个客户端不能同时
操作同样的数据。在此之中存在着如下问题:
    1. 并发性问题:例如为两架飞机选择飞行人员,都执行查询未被分配的机长;但是第一个查询以后找到一个未被安排的并且安排了,但是还未等到把他更新为已分配,第二个查询开始了,那么这样就会有冲突额
    2. 完整性问题:就是sql语句在某些时候要作为一个单元完整的被执行。
      1. 在事物执行的过程中,别的客户端不能更新事务中所有的数据,事务解决了MYSQL服务器多用户特征带来的并发性问题。事务将多语句操作中对共享资源的访问实行了串行化
      2. 只有在事务中的语句都执行成功的情况下,他们才作为一个单元被聚合并提交,假如在其中一个sql语句中报错那么这将会让所有的回滚
15.1 使用事务存储引擎
mysql> show engines\G
*************************** 1. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disa
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tabl
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign k
Transactions: YES
XA: YES
Savepoints: YES
*************************** 9. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
9 rows in set (0.00 sec)

15.2 使用SQL执行事务
MYSQL通常以自动提交模式工作,该工作方式在语句一执行时就提交了为了执行事务,先关闭自动提交模式:
    1. START TRANSACTION(或者BEGIN)语句以挂起自动提交功能
    2. 通过将自动提交会话变量设置为0来显式的关闭自动提交功能
      1. SET AUTOCOMMIT = 0;SET AUTOCOMMIT = 1;
注意:事务具有局限性,因为不是所有的语句都可以作为事务的一部分,比如你发起了一个DROP DATABASE语句是不可能会回滚的
15.9 使用事务的替代方法
问题:你需要执行事务处理,但是你的应用中使用了无事务的存储引擎?
解决:显式的锁定表,或者修改你的sql语句来弥补甚至彻底消除对事务的要求
讨论:事务是有价值的,但是有时候他们不能或者不必要使用:
      1. 你的应用中使用的存储引擎可能不支持事务,比如说MYISAM存储引擎是非事务化的,所以通过外部表锁来防止并发性问题
      2. 有时候事务是不需要的,通过修改sql语句来避免使用事务
使用锁来聚合语句:使用该锁到释放锁为止,因而适合多语句的执行,但是他并没有回滚的功能。
      1. 使用LOCK TABLES/TABLE | UNLOCK TABLES/TABLE 来获得对所有要使用的表的锁
          1. (对于要修改的表需要写锁,对于其他的需要读锁)
      2. 所发布的语句必须在组中执行
      3. 使用UNLOCK TABLE/TABLES来释放锁
重写语句可以避免事务:





























你可能感兴趣的:(事务)