mysql事务 Transactions

mysql事务 Transactions

 

1.定义
事务是操作数据的一个单元,是恢复和并发控制的基本单位。

 

2.事务的特性( ACID )
(1)Atomicity 原子性
一个事务是一个不可分割的工作单位.要么所有的语句都执行成功,要么所有的语句都不执行.
(2)Consistency 一致性
事务必须是使数据库从一个一致性状态变到另一个一致性状态.
(3)Isolation 隔离性
一个事务的执行不能被其他事务干扰,在一个事务中添加修改的数据,不能被令一个事务读取或者修改.
(4)Durability 持久性
指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

 

3.开启和结束事务

都可以开启事务,在调用以上语句时,mysql会隐式的执行 commit 操作,以结束当前客户端线程的未结束事务.
若之前执行了 lock table 操作,则所锁定的表会解锁。
提交事务用commit,回退事务用rollback

 

4.保存点( Savepoints )
在事务中用以记录语句执行位置的一个标记,可用来标记回退到哪个位置。
eg:

 

5.自动提交( AUTOCOMMIT )
mysql默认开启自动提交功能,即每条语句都会封装上 START TRANSACTION 和 COMMIT.

查看当前session是否开启自动提交

SET AUTOCOMMIT=0 关闭自动提交
SET AUTOCOMMIT=1 开启自动提交

 

6.隔离级 Isolation Levels
这个概念不得不讲,隔离级是影响事务间数据改变时对其他事务数据可见性和准确性的关键要素。
mysql支持4种级别的隔离级:
(1)READ UNCOMMITTED
这种可以让所有事务看到其他事务中未提交的数据改变。可能读取到脏数据。
These are called dirty reads —the data is said to be dirty because the change is not permanent yet.
(2)READ COMMITTED
只有在一个事务中显示提交了的(调用了commit语句)数据,在其他事务中才是可见了.
可以避免脏数据读取,但是可能在事务A执行过程中,其他事务修改数据导致事务A中已读数据失效。
ps:在sql server和oracle中默认用了此级别。
(3)REPEATABLE READ
这是mysql默认的隔离级。
用此隔离级当再次读取已经读过的数据时,读取的数据都是相同的,即使在这个事务执行过程中,令一个事务修改并提交了其中的数据。
这可能导致读取的数据已经不存在。
下面看《mysql_administrators_bible》中的一段话:
Using the REPEATABLE READ isolation level, all reads within a transaction show the same
data values, even if a second transaction has committed a data change while the first
transaction was still running. If a transaction starts, reads a row, waits 60 seconds, and
reads the same row again, both data reads will be the same— even if in those 60 seconds
another transaction has changed and committed data. The first transaction has the same
data when it repeats the read. Any transactions started after the data commit will see the
new data.
REPEATABLE READ may not seem like a good idea —after all, if the data changes,
shouldn’t a transaction be aware of that? The problem is that a transaction may take
different actions based on the values of the data. Data values changing in the middle of
a transaction may lead to unexpected consequences. Consider what would happen if
the schema changed in the middle of a transaction, and the desired fields or tables cease
to exist!
(4)SERIALIZABLE
当读数据时加读取锁(LOCK IN SHARE MODE),其他事务允许读操作,但是在读取锁释放之前不允许更新数据.

 

7.查看当前连接的隔离级

 

8.查看服务器的隔离级

 

9.设置隔离级
SET @@{global|session}.tx_isolation= {read-uncommitted|
read-committed|repeatable-read|serializable}
或者
SET {GLOBAL | SESSION} TRANSACTION ISOLATION LEVEL {READ
UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

 

PS:除特殊情况外,一般不要随便改动数据库默认的隔离级。
那么数据库到底怎么实现的这几种隔离级别呢?----锁
接下来介绍一下mysql的锁。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值