事物就是一组应该一起成功或一起失败的sql语句.
事物具有原子性,一致性,隔离性和持久性的特点:
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如AB互相转钱,无论怎么转,总额都不会变化.
3、隔离性(Isolation):同一时间,只允许一个事务修改同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
事物的执行:
START TRANSACTION;
BEGIN;
UPDATE .....
INSERT .....
COMMIT(ROLLBACK);
使用保存点:
使用保存点可以回滚到事务中的某些点,而且无须终止事物. 你可以使用savepoint标识符为事物设置名称, 并使用ROLLBACK TO标志语句将事物回滚到指定的保存点而不中止事务.
SAVEPOINT mark1
ROLLBACK To mark1
MySql的锁
mysql有两种锁
内部锁: mysql在自身服务器内部执行内部锁, 以管理多个回话对表内容的争用.
外部锁: mysql为客户回话提供选项来显式地获取表锁, 以阻止其他回话访问表.
内部锁又可以分为下面两种类型:
行级锁: 行级锁是细粒度的, 只有被访问的行会被锁定.这允许通过多个回话,同时进行写操作.只有innodb支持行级锁
表级锁: mysql 对MyISAM, MEMORY, MERGE 表使用表级锁,一次只允许一个回话更新这些表.这种锁定级别是的这些存储引擎更适用于只读的或以读取操作为主的或单用户的应用程序.
外部锁:
使用 LOCK TABLE 和 UNLOCK TABLES 语句来控制锁定.
READ 和 WRITE 的表锁定解释如下:
READ: 当一个表被锁定为READ时, 多个会话可以从表中读取数据而不需要获取锁. 此外, 多个回话可以在同一个表上获得锁, READ也被称为共享锁.当READ锁被保持时,没有回话可以将数据写入表格中.包括持有该锁的回话.如果有任何写入尝试,该操作将处于等待状态,知道READ锁被释放.
WRITE: 当一个表被锁定为WRITE时,除持有该锁的会话, 其他任何会话都不能读取或向表中写入数据.WRITE锁也被称为排它锁.
命令:
LOCK TABLES table_name [READ | WRITE];
UNLOCK TABLES;
锁队列:
除共享锁外(一个表可以有多个共享锁), 没有两个锁可以一起加在一个表上, 如果一个表已经有一个共享锁,此时有一个排它锁要进来, 那么他将被保留在队列中,直到共享锁被释放.当排它锁在队列中时, 所有后续的共享锁也会被保留在队列中.