mysql > help lock 

  言归正传,在RDBMS中,事务必须要保证数据文件的ACID:

事务引起的一系列操作要么全部完成要么全部不完成,不能一部分完成一部分失败。

       Consistency          一致性           事务操作前后的系统状态是不变的,比如转账的时候,甲给乙转账5000,那么甲的账户少了5000,乙的账户必须多5000。不能出现甲的账户少了,乙的账户没多,或者甲的账没少但乙的账户多了的情况出现。

  Isolation              隔离性           牵扯到事物的隔离级别,下文论述。

       Durability            持久性

       mysql事务的隔离级别分为4级别:

       READ-UNCOMMITED      读未提交       甲执行一个事务操作一张表,还未提交事务,表中的改变乙就可以看到,隔离级别最低。

  READ-COMMITTED         读提交          甲执行一个事务,在未提交事务之前,表中的改变已是看不到的,甲提交后,已就可以看到变化隔离级别稍稍变高。

  REPATABLE-READ           可重读          只要自己不提交事务,无论别人怎么修改表都不会影响自己的数据,隔离级别很高了,但是仍有幻读的现象发生。

  SERIABLIZABLE                可串行         几个人同时操作一张表,必须等一方提交事务之后,下一个才能继续操作,隔离级别最高,但并发能力大大减弱。

      在这几个隔离级别中,隔离级别越高,并发能力就越弱,除非在银行和金融等领域,否则不建议采用较高的隔离级别,这样会使系统的并发能力大大下降,我们必须在隔离级别和并发能力两者之间妥协折中,选择最合适的隔离级别。在mysql中可以使用 mysql> SHOW GLOBAL VARIABLES LIKE "%iso%"; 查看mysql的事务的隔离级别,在我的mysql服务器上结果是:REPEATABLE-READ  可重读.

 

-> ;
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)

如果要改变事务的隔离级别,执行 mysql>SET tx_isolation='READ-UNCOMMIT'; 或者在mysql的配置文件中修改.

一个事务的执行过程大概是这样的:

mysql> START  TRANSACTION;     启动事务
mysql>   sql语句 
mysql>   sql语句
mysql>   sql语句
...........
mysql> COMMIT                   提交事务,一旦提交代表事务已经完成,所有sql语句全部生效或者失败

或者

myslq>ROLLBACK                  回滚,之前所有执行的sql语句全部失效

 

mysql事务还支持保存点,可以回滚到保存点时候的状态

mysql>START  TRANSACTION;
mysql>DELETE FROM tutors WHERE Tid=30;
mysql>SAVEPOINT   aa;                                注意保存点不能使用数字
mysql>DELETE FROM tutors  WHERE Tid=14;
mysql>SAVEPOINT   ab;                                mysql指令不区分大小写
mysql>DELETE FROM  tutors  WHERE Tid=18;
mysql>SAVEPOINT    ac;
mysql>ROLLBACK  TO ab;                               回滚到ab那个点的状态
mysql>COMMIT;                                        提交事物,ab点之前的所有sql语句生效

在mysql中有一个服务器变量autocommit可以用来查看有没有明确指定事务自动提交,可以用指令查看

myslq> SELECT    @@automit;
或者
mysql> show   variables  like  "%autocommit%";

在我的Mysql服务器上,没有关闭自动提交

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

 建议明确使用事务,关闭自动提交!因为,如果开启autocommit,那么每执行一次sql语句就会提交一次,每次提交都会产生一次磁盘IO,这样会导致系统性能下降,任何产生IO的地方都会导致系统性能下降.因为内存的速度和机械硬盘的速度相差了n个数量级.使用指令 

mysql>SET autocommit=OFF:[mysqld]段加上autocommit = OFF.

最后,事务的状态分为:

活动的

部分提交的

失败的

中止的

提交的