Mysql 事务
事务的开始
begin 在5.5以上的版本 无需手工执行begin 在执行DML语句时 会自动在前天加一个bgein命令
事务的结束
commit 提交事务
如果要回滚 需要执行 rollback
自动提交策略,默认是1
mysql> select @@autocommit;
+--------------+
@@autocommit
+--------------+
1
+--------------+
1 row in set (0.00 sec)
自动提交是否打开,一般在有事务需求的MySQL中,将其关闭
不管有没有事务需求,我们一般也都建议设置为0,可以很大程度上提高数据库性能
(1)
set autocommit=0;
set global autocommit=0;
(2)
vim /etc/my.cnf
autocommit=0
隐式提交语句
导致提交的非事务语句:
DDL语句: (ALTER、CREATE 和 DROP)
DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
导致隐式提交的语句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE
事务的特性
Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。不能出现中间状态。
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
Isolated(隔离性)
事务之间不相互影响。
Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
事务的隔离级别
影响到数据的读取,默认的级别是 RR模式.
transaction_isolation 隔离级别(参数)
负责的是,MVCC,读一致性问题
- RU : 读未提交,可脏读,一般部议叙出现
- RC : 读已提交,可能出现幻读,可以防止脏读.
- RR : 可重复读,功能是防止”幻读”现象 ,利用的是undo的快照技术+GAP(间隙锁)+NextLock(下键锁)
- SR : 可串行化,可以防止死锁,但是并发事务性能较差
补充: 在RC级别下,可以减轻GAP+NextLock锁的问题,但是会出现幻读现象,一般在为了读一致性会在正常select后添加for update语句.但是,请记住执行完一定要commit 否则容易出现所等待比较严重.
例如:
[world]>select * from table_name where id=1 for update;
[world]>commit;
如何设置隔离机制
配置文件中指定
[mysqld]
transaction-isolation = READ-COMMITTED
临时修改
SET [GLOBAL SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
其中的<isolation-level>可以是:
– READ UNCOMMITTED
– READ COMMITTED
– REPEATABLE READ
– SERIALIZABLE
Mysql 事务
http://www.jcwit.com/article/65/