MySql-3 事务

MySql 事务

1 事务的介绍

  1. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  2. 事务用来管理 DDL、DML、DCL 操作,比如 insert,update,delete 语句,默认是自动提交的。
  3. 一般来说,事务是必须满足4个条件:
  • Atomicity(原子性):构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。
  • Consistency(一致性):数据库在事务执行前后状态都必须是稳定的或者是一致的。
  • Isolation(隔离性):事务之间不会相互影响。
    由锁机制和MVCC机制来实现的
    MVCC:优化读写性能(读不加锁、读写不冲突)
  • Durability(持久性):事务执行成功后必须全部写入磁盘。

2 事务的开启

在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。因此手动的开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ,或者执行命令 SET AUTOCOMMIT=0 ,用来禁止使用当前会话的自动提交。
常见操作:

  1. BEGIN 或 START TRANSACTION ;显式地开启一个事务;
  2. COMMIT 也可以使用 COMMIT WORK ,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
  3. ROLLBACK 有可以使用 ROLLBACK WORK ,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

3 事务并发会出现的问题

  1. 丢失更新:一个事务更新之后,另一个事务也更新了,但是第二个事务回滚了,则第一个事务也被回滚了。
  2. 脏读:一个事务读取到另一个事务未提交的数据。
  3. 不可重复读:一个事务因读取到另一个事务已提交的update或者delete数据。导致对同一条记录读取两次以
    上的结果不一致。
  4. 幻读:一个事务因读取到另一个事务已提交的insert数据。导致对同一张表读取两次以上的结果不一致。

3.1 事务4种隔离级别

  • 现在来看看MySQL数据库为我们提供的四种隔离级别(由低到高):
  1. Read uncommitted (读未提交):最低级别,任何情况都无法保证。
  2. Read committed (RC,读已提交):可避免脏读的发生。
  3. Repeatable read (RR,可重复读):可避免脏读、不可重复读的发生。
    (注意事项:InnoDB的RR还可以解决幻读,主要原因是Next-Key锁,只有RR才能使用Next-Key锁)
  4. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
    (由MVCC降级为Locking-Base CC)
  • 默认的隔离级别
  1. 大多数数据库的默认隔离级别是Read Committed,比如Oracle、DB2等。
  2. MySQL数据库的默认隔离级别是Repeatable Read。
  • 查看和设置隔离级别
  1. MySql查看隔离级别:select @@tx_isolation;
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

  1. MySql修改设置隔离级别
  • 语法:
set [glogal | session] transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称;
  • sql
//设置read uncommitted级别:
set session transaction isolation level read uncommitted;

//设置read committed级别:
set session transaction isolation level read committed;

//设置repeatable read级别:
set session transaction isolation level repeatable read;

//设置serializable级别:
set session transaction isolation level serializable;
  • 示例:修改事务隔离级别为 read committed
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.02 sec)

mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set (0.00 sec)

4 总结

  1. 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
  2. 对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为 Read Committed 。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值