`

转:mysql事务 Transactions

阅读更多

mysql事务 Transactions
1.定义
事务是操作数据的一个单元,是恢复和并发控制的基本单位。
2.事务的特性( ACID )
(1)Atomicity 原子性
一个事务是一个不可分割的工作单位.要么所有的语句都执行成功,要么所有的语句都不执行.
(2)Consistency 一致性
事务必须是使数据库从一个一致性状态变到另一个一致性状态.
(3)Isolation 隔离性
一个事务的执行不能被其他事务干扰,在一个事务中添加修改的数据,不能被令一个事务读取或者修改.
(4)Durability 持久性
指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
3.开启和结束事务
begin  
begin work  
start transaction  
 
都可以开启事务,在调用以上语句时,mysql会隐式的执行 commit 操作,以结束当前客户端线程的未结束事务.
若之前执行了 lock table 操作,则所锁定的表会解锁。
提交事务用commit,回退事务用rollback
4.保存点( Savepoints )
在事务中用以记录语句执行位置的一个标记,可用来标记回退到哪个位置。

mysql> SELECT id,name FROM trans_test;  
+----+------+  
| id | name |  
+----+------+  
| 1 | a |  
| 2 | b |  
+----+------+  
mysql> START TRANSACTION;  
mysql> UPDATE trans_test SET name=’z’ WHERE id = 1;  
mysql> SAVEPOINT savepoint_one;  
mysql> UPDATE trans_test SET name=’y’ WHERE id = 2;  
mysql> SELECT id,name FROM trans_test;  
+----+------+  
| id | name |  
+----+------+  
| 1 | z |  
| 2 | y |  
+----+------+  
mysql> ROLLBACK TO SAVEPOINT savepoint_one;  
mysql> SELECT id,name FROM trans_test;  
+----+------+  
| id | name |  
+----+------+  
| 1 | z |  
| 2 | b |  
+----+------+  
mysql> COMMIT;  
 
5.自动提交( AUTOCOMMIT )
mysql默认开启自动提交功能,即每条语句都会封装上 START TRANSACTION 和 COMMIT.
查看当前session是否开启自动提交
mysql> show session variables like 'AUTOCOMMIT';  
+---------------+-------+  
| Variable_name | Value |  
+---------------+-------+  
| autocommit    | ON    |  
+---------------+-------+  
 
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中已读数据失效。
在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.查看当前连接的隔离级
mysql> show session variables like 'tx_isolation';  
+---------------+-----------------+  
| Variable_name | Value           |  
+---------------+-----------------+  
| tx_isolation  | REPEATABLE-READ |  
+---------------+-----------------+  
1 row in set (0.00 sec)  
或者  
mysql> select @@session.tx_isolation;  
+------------------------+  
| @@session.tx_isolation |  
+------------------------+  
| REPEATABLE-READ        |  
+------------------------+  
1 row in set (0.00 sec)  
或者  
mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE  
-> FROM INFORMATION_SCHEMA.SESSION_VARIABLES  
-> WHERE VARIABLE_NAME=’tx_isolation’;  
+---------------+------------------+  
| VARIABLE_NAME | VARIABLE_VALUE |  
+---------------+------------------+  
| TX_ISOLATION | READ-UNCOMMITTED |  
+---------------+------------------+  
 
8.查看服务器的隔离级
mysql> SELECT @@global.tx_isolation;  
+-----------------------+  
| @@global.tx_isolation |  
+-----------------------+  
| REPEATABLE-READ       |  
+-----------------------+  
1 row in set (0.00 sec)  
或者  
mysql> show global variables like 'tx_%';          
+---------------+-----------------+  
| Variable_name | Value           |  
+---------------+-----------------+  
| tx_isolation  | REPEATABLE-READ |  
+---------------+-----------------+  
1 row in set (0.01 sec)  
或者  
mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE  
-> FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES  
-> WHERE VARIABLE_NAME=’tx_isolation’;  
 
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}
 
分享到:
评论

相关推荐

    sails-mysql-transactions, 带有mySQL事务支持的帆/水线 ORM.zip

    sails-mysql-transactions, 带有mySQL事务支持的帆/水线 ORM 带有复制支持的MySQL事务性 ORMsails-mysql-transaction 是用于MySQL的船帆ORM适配器,具有事务和复制群集支持。这个适配器在流行的sails-mysql 适配器...

    Distributed Transactions in MySQL

    Distributed Transactions in MySQL 分阶段提交事务

    sails-mysql-transactions:带有mySQL事务支持的sailswaterline ORM

    安装将sails-mysql-transactions添加到应用程序的package.json 。 如果您的软件包中尚未安装sails请不要直接运行install。 如果您已经安装了sails-mysql ,则可能会干扰此模块的操作。 从package.json删除它,并使用...

    PHP中实现MySQL嵌套事务的两种解决方案

    在MySQL的官方文档中有明确的说明不支持嵌套事务: 代码如下: Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START ...

    MYSQL

    5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能 5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务(Transactions) 5.4.4 存储过程和...

    MySQL中文参考手册.chm

    5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能 5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务(Transactions) 5.4.4 存储过程...

    MySQL中文参考手册

    + 5.4.3 事务(Transactions) + 5.4.4 存储过程和触发器 + 5.4.5 外键(Foreign Keys) # 5.4.5.1 不使用外键的理由 + 5.4.6 视图(Views) + 5.4.7 '--'作为一个 注解的开始 o 5.5 MySQL 遵循什么标准? o 5.6 ...

    Mysql数据库的QPS和TPS的意义和计算方法

    TPS : Transactions Per Second 是事务数/秒,是一台数据库服务器在单位时间内处理的事务的个数。 在对数据库的性能监控上经常会提到QPS和TPS这两个名词,下面就分别简单的分享一下关于MySQL数据库中的QPS和TPS的...

    transactions-dubbo:dubbo项目基于atomikos的分布式事务管理

    atomikos本身支持使用两段提交协议在一个项目中,管理多个数据库事务,如mysql的事务,和符合JMS规范的多个消息事务,如activemq的事务。但是现在因为微服务框架的流行使得多个数据库的事务不在一个项目内,使得一个...

    test-transactions:关于 JOTM 事务的 Grails 教程

    关于 JOTM 事务的 Grails 教程在本教程中,我希望能够向 Java 开发人员解释我如何将移植到 grails 应用程序。 在提供。 它可以在下的这个项目中找到。 这就是正在实现的目标,目前我还没有将它分布在多个数据库上,...

    tikv:分布式事务键值数据库,最初是为补充TiDB而创建的

    TiKV内置在Rust中,并由Raft提供支持,最初创建时是为了补充 (与MySQL协议兼容的分布式HTAP数据库)。 TiKV(“ Ti”代表钛)的设计灵感来自Google的一些出色的分布式系统,例如BigTable,Spanner和Percolator,...

    tidb:TiDB是与MySQL协议兼容的开源分布式HTAP数据库

    TiDB(“ Ti”代表Titanium)是一个开源的NewSQL数据库,它支持混合事务处理和分析处理(HTAP)工作负载。 它与MySQL兼容,并具有水平可伸缩性,强一致性和高可用性。 水平可伸缩性 TiDB只需添加新节点即可扩展SQL...

    《MYSQL备份与恢复》之 Innodb与 MyISAM引擎

     InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作:  xtraBackup在备份的时候...

    SQLServer数据库中开启CDC导致事务日志空间被占满的原因

    SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为: 在执行增删改语句(产生事务日志)的过程中提示,The transaction log for database ‘***’ is full due to ‘REPLICATION'(数据库“***...

    SQL Server重温 事务

    为什么使用事务 当对多... commit transaction end try begin catch select ERROR_NUMBER() as errornumber rollback transaction end catch 隐式设置事务 代码如下: set implicit_transactions on; — 启动隐式事务 g

    point-of-sales-proof-of-concept:使用 Hadoop MapReduce、Hive 和 Luigi 处理事务日志的概念证明

    确保 HDFS 上的 /input/transactions_raw 目录中存在事务日志文件,以及 MySQL 数据库中的“产品”目录,其凭据在 settings.py 中配置。 MySQL 产品目录的架构如下所示: CREATE TABLE products ( id INT(32) ...

    医院门诊查询系统

    使用事务保证数据完整性,组件化开发-This system is constructed with the principle of modularity, developed with java+jsp+mysql, under structure of B/S, meanwhile has the log recording system inside and...

    scrapbook:PHP缓存库,顶部带有用于Memcached,Redis,Couchbase,APC(u),SQL的适配器以及其他功能(例如事务处理,踩踏保护)

    MySQL PostgreSQL SQLite的 文件系统 记忆 特征 本地缓冲区 交易次数 踩踏保护 分片 介面 键值存储 psr /缓存 psr /简单缓存 馆藏 兼容性 执照 安装与使用 如果您使用Composer管理项目的依赖项,只需将对...

    分布式事务键值数据库,最初是为了补充 TiDB 而创建的

    TiKV 内置 Rust 并由 Raft 提供支持,最初创建是为了补充TiDB ,这是一个与 MySQL 协议兼容的分布式 HTAP 数据库。TiKV('Ti'代表钛)的设计灵感来自谷歌的一些伟大的分布式系统,如BigTable、Spanner和Percolator,...

    shardingsphere:分布式数据库生态圈

    它们都提供数据横向扩展,分布式事务和分布式治理的功能,适用于各种情况,例如Java同构,异构语言和云原生。 Apache ShardingSphere旨在合理地充分利用分布式系统中现有数据库的计算和存储容量,而不是全新的...

Global site tag (gtag.js) - Google Analytics