事务是由一组mysql语句组成,它由一个用户输入,并以修改成持久的或则滚动到原来状态而终结,在mysql中,当一个会话开始时,系统变量AUTOCOMMIT值为1,即自动功能是打开的,而用户每执行一条sql语句后,改语句对数据库的修改就立即被提交成持久性修改保存到磁盘上,一个事务也就结束了。因此,用户必须关闭自动提交,事务才能由多条sql语句组成,使用如下语句:
set @@autocommit=0;
执行了上面的语句后,必须明确地指明每个事务的终止,事务中的sql语句对数据库所做的修改才能成为持久化修改。否则用户通过ROLLBACK可以撤销修改,;commit语句可以持久化修改。
1.开始事务
当一个应用程序的第一条sql语句或则在commit或rollback语句后的第一条sql执行后,一个新的事务也就开始了。另外还可以使用下面的语句来显示地启动一个事务:
start transation | begin work
2.结束事务
commit语句是提交语句,他使得从事务开始以来所执行的所有数据修改成为数据库的永久部分,他标志一个事务的结束,其格式为:
commit [work] [ and [no] chain ] [ [ no ] release]
可选的and chain字句会在当前事务结束时,立即启动一个新事务,并且新事务与刚结束的事务有相同的隔离等级;release子句在终止当前事务后,会让服务器断开当前客户端的链接,包含no关键字可以抑制chain或则release完成。
注意:mysql使用的是平面事务模型,因此嵌套的事务是不允许的。在第一个事务里面使用start transation命令后,当第二个事务开始时,自动地提交第一个事务。同样,下面的mysql语句运行时,都会隐式地执行一条commit命令。
DROP DATABASE | DROP TABLE
CREATE INDEX | DROP INDEX
ALTER TABLE | RENAME TABLE
LOCK TABLES | UNLOCK TABLES
SET AUTOCOMMIT=1
3.撤销事务
rollback [ work ]
4. 回滚到某个点:
savepoint s1; rollback to savepoint s1;commit work;
5.事务隔离等级
set global | session transation isolation level
serializable | repeatable read | read commited | read uncommited
序列化:最大限度隔离
可读重复:在这一级上,事务不会被看成是一个序列。不过当前在执行事务的变化不能看到,也就是说,如果用户在同一个事务执行同调select语句数次,结果总是相同。
提交读:
未提交读:最小限度隔离
InnoDB表类型在事务中自动执行行级锁定。
MyISAM表类型只支持表级锁定,当涉及大量的读操作而不是写操作时,他提供了比行级和页级锁定更好的性能。
页锁定 mysql锁定表中的某些行(称作页)
在对一个事务表使用表锁定的时候需要注意以下几点:
1.在锁定表时,会隐式地提交事务,在开始一个事务时,如start transation,会隐式地解开所有表锁定。
2.在事务中,系统变量autocommit值必须等于0.否则mysql会在调用lock tables后立即释放表锁定,并且很容易形成死锁。
lock tables xs read 在表xs上设置一个只读锁定。
logck tables kc write; 在kc表上设置一个写锁;
unlock tables解锁。