MySQL事务 ================================================================================================================================================ 1、事务 一组原子性的SQL查询,或者是一个独立的工作单元。 2、ACID测试 A:atomicity 原子性,整个事务中的所有操作要么全部成功执行,要么全部失败回滚 C:consistency 一致性,数据库总是从一个一致性状态转换到另一个一致性状态 I:isonlation 隔离性,一个事务在所作出的操作提交之前,是不能为其它事务所见的,隔离有多种级别 D:durability 持久性,一旦事务提交,则其所作的修改会永远保存于数据库中 3、事务(只有支持事务的存储引擎支持此操作) 启动事务:START TRANSACTION ..... 执行语句 ..... 结束事务: 提交:COMMIT 回滚:ROLIBACK 4、验证操作 {help Transation} SHOW GLOBAL VARIABLES LIKE 'session_autocommit'; # 此参数表示自动提交事务,建议显示请求和提交事务,而不使用自动提交功能。 SET @@[session.autocommit=0; # 关闭自动提交事务功能 START TRANSACTION; # 启动一个事务 SELECT * FROM students; # 查看数据 ROLLBACK; # 回滚 SELECT * FROM students; # 查看数据 SAVEPOINT name; # 保存点,表示保存此处的时间点,可以回滚到保存点的时刻 ROLLBACK TO name; # 回滚到保存点 5、事务隔离级别 READ-UNCOMMITTD (读未提交) # 可以{可能}读到别人[尚未提交]的数据 --> 脏读 READ-COMMITED (读提交) # 只有别人提交完毕的数据才进行读取,如果没提交,则读取到的是启动事务的那一刻的数据。重复读取的时候读取的数据 不一定一直一样 --> 不可重复读 REPEATABLE-READ (可重读) # InnoDB的隔离级别,即便修改完提交的数据,但依然读到的是以前的数据,所以未必是真实的数据 --> 幻读 SERIALIZABLE (可串行化) Note:SELECT @@session.tx_isolation; tx_isolation=参数定义存储引擎的隔离级别。可在SESSION级别进行修改 存在问题: 脏读:读到未被提交的数据 不可重复读:两次读取到的数据不一致 幻读:尽管数据发生改变,但依旧坚持一个数据 加锁读: 6、死锁 竞争同一个资源。{两个或者多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态} 7、事务日志 事务日志文件成组出现。 ib_logfile0 ib_logfile1 Note:事务日志相关参数 innodb_log_file_size = 5242880 # 事务日志文件大小 innodb_log_files_in_group = 2 # 每组的事务日志个数 innodb_mirrored_log_groups = # 镜像事务日志 innodb_log_group_home_dir = ./ # 事务日志家目录 ====================================================================================================================================