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 带有复制支持的MySQL事务性 ORMsails-mysql-transaction 是用于MySQL的船帆ORM适配器,具有事务和复制群集支持。这个适配器在流行的sails-mysql 适配器...
Distributed Transactions in MySQL 分阶段提交事务
安装将sails-mysql-transactions添加到应用程序的package.json 。 如果您的软件包中尚未安装sails请不要直接运行install。 如果您已经安装了sails-mysql ,则可能会干扰此模块的操作。 从package.json删除它,并使用...
在MySQL的官方文档中有明确的说明不支持嵌套事务: 代码如下: Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START ...
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 存储过程和...
TPS : Transactions Per Second 是事务数/秒,是一台数据库服务器在单位时间内处理的事务的个数。 在对数据库的性能监控上经常会提到QPS和TPS这两个名词,下面就分别简单的分享一下关于MySQL数据库中的QPS和TPS的...
+ 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 ...
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 存储过程...
atomikos本身支持使用两段提交协议在一个项目中,管理多个数据库事务,如mysql的事务,和符合JMS规范的多个消息事务,如activemq的事务。但是现在因为微服务框架的流行使得多个数据库的事务不在一个项目内,使得一个...
关于 JOTM 事务的 Grails 教程在本教程中,我希望能够向 Java 开发人员解释我如何将移植到 grails 应用程序。 在提供。 它可以在下的这个项目中找到。 这就是正在实现的目标,目前我还没有将它分布在多个数据库上,...
TiKV内置在Rust中,并由Raft提供支持,最初创建时是为了补充 (与MySQL协议兼容的分布式HTAP数据库)。 TiKV(“ Ti”代表钛)的设计灵感来自Google的一些出色的分布式系统,例如BigTable,Spanner和Percolator,...
GTID 是 MySQL 8.0 中引入的一种新的 transactions identification 方法,它可以帮助我们追踪事务的执行情况。在这个问题中,我们需要了解 GTID 的使用方法和其在复制中的应用。 在这个问题中,正确的答案是 A)...
TiDB(“ Ti”代表Titanium)是一个开源的NewSQL数据库,它支持混合事务处理和分析处理(HTAP)工作负载。 它与MySQL兼容,并具有水平可伸缩性,强一致性和高可用性。 水平可伸缩性 TiDB只需添加新节点即可扩展SQL...
InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作: xtraBackup在备份的时候...
SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为: 在执行增删改语句(产生事务日志)的过程中提示,The transaction log for database ‘***’ is full due to ‘REPLICATION'(数据库“***...
为什么使用事务 当对多... commit transaction end try begin catch select ERROR_NUMBER() as errornumber rollback transaction end catch 隐式设置事务 代码如下: set implicit_transactions on; — 启动隐式事务 g
确保 HDFS 上的 /input/transactions_raw 目录中存在事务日志文件,以及 MySQL 数据库中的“产品”目录,其凭据在 settings.py 中配置。 MySQL 产品目录的架构如下所示: CREATE TABLE products ( id INT(32) ...
PDO 详解 ...它支持多种数据库管理系统,包括MySQL...* 支持 transactions,能够实现事务处理 * 支持 stored procedures,能够调用存储过程 PDO是PHP中的一种强大且灵活的数据库访问接口,能够满足各种数据库操作需求。
使用事务保证数据完整性,组件化开发-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...
MySQL PostgreSQL SQLite的 文件系统 记忆 特征 本地缓冲区 交易次数 踩踏保护 分片 介面 键值存储 psr /缓存 psr /简单缓存 馆藏 兼容性 执照 安装与使用 如果您使用Composer管理项目的依赖项,只需将对...