事务笔记

95 阅读2分钟

-- 请求一
show variables like 'transaction_isolation'

set session  transaction_isolation = 'repeatable-read'

set autocommit = 0 ;

start transaction;

SELECT money from person WHERE name = 'wangys';
-- 假如说这里模拟Java 应用对上述sql查出来的值进行 money + 2;
-- 假如查出来是 money 是 0 ;则Java算出来是 2;
-- 直接通过业务主键对原值进行 set 请求二查出来的也是0,这样会造成数据丢失。
UPDATE person SET money =  2 where name = 'wangys';

commit;

-- repeatable-read的查询是查询的一致性试图的数据, 写则是是通过加锁对最新已提交的数据进行修改



-- 请求二
show variables like 'transaction_isolation'

set session  transaction_isolation = 'repeatable-read'

set autocommit = 0 ;

start transaction;

SELECT money from person WHERE name = 'wangys';
-- 假如说这里模拟Java 应用对上述sql查出来的值进行 money + 2;
-- 假如查出来是 money 是 0 ;则Java算出来是 2;
-- 直接通过业务主键对原址进行 set 这样会造成数据丢失。
UPDATE person SET money =  2 where name = 'wangys';

commit;


SHOW VARIABLES LIKE 'log_bin%';

show master logs;

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

-- log_name:可以指定要查看的 binlog 日志文件名,如果不指定的话,表示查看最早的 binlog 文件。
-- pos:从哪个 pos 点开始查看,凡是 binlog 记录下来的操作都有一个 pos 点,这个其实就是相当于我们可以指定从哪个操作开始查看日志,如果不指定的话,就是从该 binlog 的开头开始查看。
-- offset:这是是偏移量,不指定默认就是 0。
-- row_count:查看多少行记录,不指定就是查看所有。

-- 根据时间恢复
mysqlbinlog --start-datetime="2023-04-19 16:30:01" --stop-datetime="2023-04-19 01:29:02" --database=wangys /usr/local/mysql/bin/mysql-bin.000026 | mysql -h 127.0.0.1 -uroot -p



--查看死锁日期是否开启
show variables like 'innodb_print_all_deadlocks';
--开启
set global innodb_print_all_deadlocks = 1;
--查看错误日志路径
show variables like 'log_error%';