mysql 事物默认是自动提交的
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
例如:A——B转帐,对应于如下两条sql语句
update account set money=money-100 where name=‘a’; update account set money=money+100 where name=‘b’;
涉及命令
脏读
不可重复读
幻读
一个单表数据
DROP TABLE IF EXISTS `heros_temp`; CREATE TABLE `heros_temp` ( `id` int(11) NOT NULL, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of heros_temp -- ---------------------------- INSERT INTO `heros_temp` VALUES (1, ‘张飞‘); INSERT INTO `heros_temp` VALUES (2, ‘关羽‘); INSERT INTO `heros_temp` VALUES (3, ‘刘备‘);
基础:
注意: 这里不能开始就在cmd下启动两个客户端, 将无法出现演示结果(原因: 设置session连接是对于单个client的,所以最好是设置全局事物原则)
mysql> SHOW VARIABLES LIKE ‘transaction_isolation‘; // 查询当前隔离级别 mysql> SET global TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; // 设置隔离级别为读未提交 mysql> SET autocommit = 0; // 设置事务不自动提交(由于MySQL的事务是自动提交的, 这里需要改一下) mysql> slelect @@autocommit // 查询默认的提交事物的方式 mysql> slelect @@transaction_isolation // 查询默认的隔离级别
登录:
mysql -u root -p
确认下面两个配置
客户端一 开始事物 并且插入一条数据
我们来客户端查看的表中的数据
显然出现 了问题
客户端2 查询全表数据
客户端1 开启事物 修改id=3原name‘为刘备的数据
再次来客户端2查看一下的数据
出现问题
客户端2查询数据
客户端1增加一条数据
再次来客户端2查看一下数据,必须满足第一次查询的条件
出现问题,
最后;别忘记了 将将全局隔离级别 恢复为可重复读
原文:https://www.cnblogs.com/dgwblog/p/11784421.html