多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 事务定义 事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。 而整个单独单元作为一个不可分割的整体, 如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态; 如果单元中的所有SQL语句均执行成功,则事物被顺利执行。 ## 事务的特征 - 原子性(Atomicity):事务所包含的一系列数据库操作要么全部成功执行,要么全部回滚; - 一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态; - 隔离性(Isolation):并发执行的事务之间不能相互影响; - 持久性(Durability):事务一旦提交,对数据库中数据的改变是永久性的。 ## 事务并发带来的问题 - 脏读:一个事务读取了另一个事务未提交的数据; - 不可重复读:同样条件下两次读取结果不同,也就是说,被读取的数据可以被其它事务**修改**; - 幻读:幻读的重点在于**新增或者删除**,同样条件下两次读出来的**记录数**不一样 ## 四种隔离级别 Serializable (串行化):可避免脏读、不可重复读、幻读的发生。 Repeatable read (可重复读):可避免脏读、不可重复读的发生。 Read committed (读已提交):可避免脏读的发生。 Read uncommitted (读未提交):最低级别,任何情况都无法保证。 ```javascript 脏读 不可重复读 幻读 read uncommitted:读未提交 × × × read committed:读已提交 √ × × repeatable read:可重复读 √ √ × serializable:串行化 √ √ √ ``` ## 事务的使用 以第一个 DML 语句的执行作为开始,以下面的其中之一作为结束: >COMMIT 或 ROLLBACK 语句 DDL 或 DCL 语句(自动提交) 用户会话正常结束 系统异常终了 ~~~ begin try begin transaction tr select * from Car_Brand update car_log set [reason]='ceshiceshiceshi' where [modelid]=557; select 1/0 print 'i have executed!' select * from AREA print 'executed success'; commit transaction tr end try begin catch print 'executed failed'; rollback transaction tr end catch ~~~ 事务通常以:`begin transaction`作为开始, 以`commit transacation`或`rollback transaction`结束 ## 在 MySql 中设置隔离级别 每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx\_isolation, 表示当前的事务隔离级别. - 查看当前的隔离级别: `SELECT @@tx_isolation`; - 设置当前 mySQL 连接的隔离级别: ``` set transaction isolation level read committed ``` - 设置数据库系统的全局的隔离级别: ``` set global transaction isolation level read committed ```