indb_lock_wait_timeout
1、作用
它只针对 行锁(row lock),不同事务同时更新同一行的时候,等待其他事务提交的时间,所以一个事务中如果新增数据,那么不会受到事务超时影响。
2、变量说明
(1)变量说明
innodb_lock_wait_timeout(超时时间),事务等待行锁的时间。默认是50s.
(2)查看上面的两个变量show variables like '%timeout%'
如下结果
(3)设置超时变量
1.通过语句修改set innodb_lock_wait_timeout=100;
set global innodb_lock_wait_timeout=100;
注意: global的修改对当前线程是不生效的,只有建立新的连接才生效
2. 修改my.cnf
在[mysqld] 下添加innodb_lock_wait_timeout = 120
更改完成需要重启下服务
innodb_rollback_on_timeout
1、作用
事务中每执行一个sql语句(一个satement)就有一个保存点, 在锁等待超时后是回滚事务内所有的statement还是最后一条语句;
2、变量说明
(1)变量说明
0表示rollback最后一条语句,默认值;
1表示回滚事务B内所有的statements;
(2)修改值
修改my.cnf
在[mysqld] 下添加innodb_rollback_on_timeout=1
需要重启服务
验证
表:CREATE TABLE `Student` (
`s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL,
`s_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL DEFAULT '',
`s_birth` varchar(20) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL DEFAULT '',
`s_sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL DEFAULT '',
PRIMARY KEY (`s_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8
1、超时回滚所有
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout=1
1.1、不发生事务超时的情况
1.2、发生事务超时
表结果:
2、超时回滚最后一条
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout=0
把表中数据的生日还原成90年的,重复 发生事务超时 时的步骤,最终结果
如预期一样: 事务2发生超时时,只会回滚了修改02数据的那条SQL,所以最终提交事务时,03 被次改成了95年的