Mysql数据库事务(备忘)

本文详细介绍了MySQL中的四种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ及SERIALIZABLE,包括它们的特点、应用场景及如何设置。

 一.设置Mysql的事务级别

    1) my.ini文件中:

# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE
transaction_isolation = READ-COMMITTED

    2) 启动参数指定:

./mysqld --transaction-isolation=READ-COMMITTED

    3) 命令行指定:

mysql>set global transaction isolation level READ COMMITTED

    命令行的参数列表为: 

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

    通过命令行设置事务级别之后,需要关闭当前窗口,因为修改后的新参数不会对当前会话生效.mysql中默认的事务级别为"REPEATABLE READ".可以通过"select @@global.tx_isolation;"来查看当前全局的事务级别.

 

二,事务隔离级别

    1) READ UNCOMMITTED: 隔离级别最低,并发能力最高.未提交读(读到未提交),简单来说,就是事务中(或者非事务)可以读取到其他事务已经更新但尚未提交的数据--脏读.也会出现"不可重复读""幻读"等问题. 此事务隔离级别,只会对不同事务中update/select for update等行锁进行"串行化"执行(阻塞),而对于read操作就像"没有事务"一样.(对于innodb引擎,默认情况下,R/W均会在一个自动提交的事务中进行)



图1 会话1中事务开启:执行更新,但未提交



 图2  会话2中非事务下read到未提交的数据,且update操作阻塞(因为会话1中的事务update时锁定了id = 1的行)

    2) READ_COMMITTED: 已提交读,即只能读取到已经提交的事务所update的数据,会出现"不可重复读","幻读"问题.如果2个并行的事务,其中事务1第一次read时获得一条记录,此后事务2对此记录进行了更改且事务提交,那么此时事务1再次read时,将会获得已经提交的新记录数据,因此为"不可重复的".



 图3.

    3) REPEATABLE_READ: 可重复读,有"幻读"问题;只能读取到其他事务已经提交的数据,且如果当前事务中对某条记录曾近read过,那么此后在事务中多次重复read,将会得到相同的数据,即使此时其他事务已经对此数据进行了更改;由此可见在REPEATABLE_READ隔离级别中,read操作将会产生snapshot,此后多次read只会从snapshot中获取数据;这也是它和"READ COMMITTED"的区别---"READ COMMITEED"不会使用snapshot.

    此隔离级别,通常被用在对数据一致性要求较高的环境中.它通常意味着,每个事务将会对read/update选取的行加锁.

    4) SERIALIZABLE: 串行化,隔离级别最高.将所有的事务串行化,因此并发能力有效,通常可以理解为事务导致了"表锁".



 图4 事务1中select选取行



 图5 事务2中对此行进行update,此时update阻塞直到事务1结束.

    由此可见,SERIALIZABLE级别通过对事务选取的行加锁的方式(select或者update等),来阻止其他事务对数据的更改:事务1对通过select对id=1的数据加锁,那么事务2尝试update也将阻塞直到事务1结束;此外如果事务1通过update方式对id=1的行加锁,那么事务2对此行select也会阻塞..此隔离级别通过这种方式,严格的杜绝的"脏读""不可重复读""幻读"的发生.(其他隔离级别中,不会出现read行加锁的情况.)

 

    上述各个隔离级别中,如果事务1对id = 1的数据更改,事务2也尝试update时,将会导致事务2阻塞,直到事务1提交;这也是mysql为了避免"更新丢失"的解决方式.不过在SERIALIZABLE级别中还有特殊的情况.

    "脏读": 读取了一个尚未确定的值,通常是事务中(或者在READ UNCOMMITTED隔离级别中的非事务)读取了其他事务尚未提交的值.

    "不可重复读": 脏读的一种表现,通常为多个事务并行操作时发生.

    "幻读": 多个事务并行操作时,当读取的数据位多行数据时(range),一个事务中多次读取发生数据条数不一致的情况.

  • 大小: 13 KB
  • 大小: 15.1 KB
  • 大小: 50.7 KB
  • 大小: 16.6 KB
  • 大小: 9 KB
【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率与经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网与交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟与拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理与迭代收敛过程,以便在实际项目中灵活应用与改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值