mysql 事务 原文链接http://blog.csdn.net/w_l_j/article/details/6783319
事务
在MySQL环境中,事务由作为一个单元的一个或多个SQL语句组成。这个单元中的每一个SQL语句是互相依赖的,而且单元作为一个整体式不可分割的。如果单元的一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。因而,只有事务中的所有语句都成功地执行才能说这个事务被成功地执行。
事务和ACID属性
术语”ACID”是一个简称,每一个事务的处理必须满足ACID原则,即原子性(A)、一致性(C)、隔离性(I)和持久性(D)。
(1)原子性
原子性意味着每个事务都必须被认为是一个不可分割的单元
(2)一致性
不管事务是完全成功完成还是中途失败,当事务使系统处于一致的状态时存在一致性
(3)隔离性
隔离性是指每个事物在它自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只有在它完全被执行时才能看到
(4)持久性
持久性是指即使系统崩溃,一个提交的事务仍然存在
事务处理
在sql中,当一个会话开始时,系统变量AUTOCOMMIT值为1,既自动提交功能是打开的,当用户执行一条sql语句结束后该语句对数据库的修改就立即被提交成为持久性修改保存到磁盘中,一个事务就结束了。
关闭自动提交,才能由多条SQL语句组成,使用如下语句:
SET@@AUTOCOMMIT=0;
执行此语句后必须明确地指示每个事务的终止,事务中的SQL语句对数据库所作的修改才能成为持久化修改。
delect from xs where 学号=’081101’;
select * from xs;
1、开始事务 语法格式
start transaction | begin work
一条begin work语句可以用来代替start transaction 语句,但是start transaction更常用
2、结束事务 语法格式
commit [work] [and [no] chain] [[no]release]
可选的and chain子句会在当前事务结束时,立即启动一个新事务,并且新事务与刚结束的事务有相同的隔离等级,release子句在终止了当前事务后,会让服务器断开与当前客户端的连接。包含no关键词可以抑制chain或commit完成
3、撤销事务
Rollback语句是撤销语句它撤销事务所做的修改,并结束当前这个事务 语法格式
Rollback [work] [and [no] chain] [[no] release]
在前面的举例中,若在最后加上rollback work,执行完这条语句后,前面的删除动作将被撤销,可以使用select语句查看该行数据是否还原。
4、回滚事务
除了撤销事务,用户还可以使用rollback to语句是事务回滚到某个点,在这之前需要使用savepoint语句来设置一个保存点
savepoint语法格式如下:
savepoint identifier
其中identifier为保存点的名称
rollback to savepoint 语句会向已命名的保存点回滚一个事务。如果保存点被设置后,当前事务对数据进行更改,则这些更改会在回滚中被撤销。语法格式如下:
rollback [work] to savepoint identifier
当事务回滚到某个保存点后,在该保存点之后设置的保存点将被删除
事务隔离级
只有支持事务的存储引擎才可以定义一个隔离级。定义隔离级可以使用set transaction语句
语法格式:set [global | session] transaction isolation level
serializable
|repeatable read
|read committed
|read uncommitted
(1)序列化:如果隔离级为序列化,用户之间通过一个接一个顺序地执行当前事务提供了事务之间最大限度的隔离。
(2)可重复读:在这一级上,事务不会被看成是一个序列。如果用户在同一个事务中执行同条select语句次数,结果总是相同的。
(3)提交读:readcommitted隔离级的安全性比repeatable read隔离级的安全性要差。在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个select语句可能返回不同的结果
(4)未提交读:提供了事务之间最小限度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个隔离级得事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化。
默认情况下,系统变量的值是基于每个会话设置的,但是可以通过set命令行添加global关键字修改该全局变量的值。