0. 查看数据库事务自动提交状态
SHOW VARIABLES LIKE 'autocommit';
1. 查看全局和session级别事务隔离属性
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
2.设置事务隔离属性
属性枚举值:
level: {
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
设置命令示例:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 需要root权限
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
3.设置全局隔离属性其它两种方式方式
a. 在启动命令里增加 --transaction-isolation=
level
level 可选值: READ-UNCOMMITTED
, READ-COMMITTED
, REPEATABLE-READ
, SERIALIZABLE
b. 修改配置文件
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
建立连接时关闭了自动提交功能的话,即增加autocommit=0,示例如下
db,err:=sql.Open("mysql","user:pass@tcp(ip:3306)/mydbName?charset=utf8&autocommit=0")
要注意修改mysql数据库的默认事务隔离级别,在连接池里有多个连接的情况下,使用池内某个连接查询时,极有可能得到提交前的数据(其它包含事务操作连接修改后并成功提交了数据)。
附加:
1 . 开始事务时,设置的事务隔离级别应与数据库设置的一致,否则会出现如下错误:
ERROR 1568 (25001): Transaction isolation level can't be changed while a transaction is in progress
这种错误主要是数据库有事务正在执行,还没有结束,又提交一种不同事务隔离级别的事务。
查看正在执行的事务sql(root级别用户可行,其它用户可能报错):
SELECT
p.ID,
P.USER,
P.HOST,
p.DB,
P.TIME,
T.trx_started,
T.trx_isolation_level,
T.trx_tables_locked,
T.trx_rows_locked,
t.trx_state,
p.COMMAND AS process_state
FROM `information_schema`.`INNODB_TRX` t
INNER JOIN `information_schema`.`PROCESSLIST` p
ON t.trx_mysql_thread_id=p.id
WHERE t.trx_state='RUNNING'
AND p.COMMAND='Sleep'
ORDER BY T.trx_started ASC
2. 造成上述错误的代码示例
错误代码示例(golang1.92),数据库的事务隔离级别为:READ-COMMITTED
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})
golang1.92 由于版本比较低,sql.TxOptions只支持 sql.LevelSerializable这一种级别。
正确代码,即不设置隔离级别:
tx, err := db.Begin()