mysql 事务隔离相关操作

4 篇文章 0 订阅

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-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值