`
lykm02
  • 浏览: 51020 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
转载自:http://wwty.iteye.com/blog/699137

事务的四大特征:

ACID:Atomic(原子性)、Consistent(一致性)、Isolated(独立性)、Durable (持久性)



MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关:

sql代码

1. MyISAM:不支持事务,用于只读程序提高性能 

2. InnoDB:支持ACID事务、行级锁、并发 

3. Berkeley DB:支持事务 



事务隔离级别标准:

ANSI(美国国家标准学会)标准定义了4个隔离级别,MySQL的InnoDB都支持:

sql代码

1. READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取还没commit的数据,这样可能会提高性能,但是dirty read可能不是我们想要的 

2. READ COMMITTED:在一个事务中只允许已经commit的记录可见,如果session中select还在查询中,另一session此时insert一条记录,则新添加的数据不可见 

3. REPEATABLE READ:在一个事务开始后,其他session对数据库的修改在本事务中不可见,直到本事务commit或rollback。在一个事务中重复select的结果一样,除非本事务中update数据库。

4. SERIALIZABLE:最高级别的隔离,只允许事务串行执行。为了达到此目的,数据库会锁住每行已经读取的记录,其他session不能修改数据直到前一事务结束,事务commit或取消时才释放锁。 

Mysql的默认隔离级别是:REPEATABLE READ

READ UNCOMMITTED级别会导致数据完整性的严重问题,需要自己控制如何保持数据完整性

SERIALIZABLE会导致性能问题并增加死锁的机率



Mysql事务操作语句:

1.  START TRANSACTION:开始事务,autocommit设为0,如果已经有一个事务在运行,则会触发一个隐藏的COMMIT 

2.  COMMIT:提交事务,保存更改,释放锁 

3.  ROLLBACK:回滚本事务对数据库的所有更改,然后结束事务,释放锁 

4.  SAVEPOINT savepoint_name:创建一个savepoint识别符来ROLLBACK TO SAVEPOINT 

5.  ROLLBACK TO SAVEPOINT savepoint_name:回滚到从savepoint_name开始对数据库的所有更改,这样就允许回滚事务中的一部分,保证更改的一个子集被提交 

6.  SET TRANSACTION:允许设置事务的隔离级别 

7.  LOCK TABLES:允许显式的锁住一个或多个table,会隐式的关闭当前打开的事务,建议在执行LOCK TABLES语句之前显式的commit或rollback。我们一般所以一般在事务代码里不会使用LOCK TABLES 



定义事务

MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务。
在复杂的应用场景下这种方式就不能满足需求了。
为了打开事务,允许在COMMIT和ROLLBACK之前多条语句被执行,我们需要做以下两步:
1, 设置MySQL的autocommit属性为0,默认为1
2,使用START TRANSACTION语句显式的打开一个事务

上面已经说了,当使用START TRANSACTION开始一个事物的时候,则SET autocommit=0不会起作用,因为START TRANSACTION会隐式的提交session中所有当前的更改,结束已有的事务,并打开一个新的事务。





使用SET AUTOCOMMIT语句的存储过程例子:

sql代码

1. CREATE PROCEDURE tfer_funds 

2.     (from_account int, to_account int, tfer_amount numeric(10,2)) 

3. BEGIN 

4.     SET autocommit=0; 

5.  

6.     UPDATE account_balance SET balance=balance-tfer_amount WHERE account_id=from_account; 

7.  

8.     UPDATE account_balance SET balance=balance+tfer_amount WHERE account_id=to_account; 

9.  

10.    COMMIT; 

11.END; 


使用START TRANSACITON打开事务的例子:

sql代码

1. CREATE PROCEDURE tfer_funds 

2.     (from_account int, to_account int, tfer_amount numeric(10,2)) 

3. BEGIN 

4.     START TRANSACTION; 

5.  

6.     UPDATE account_balance SET balance=balance-tfer_amount WHERE account_id=from_account; 

7.  

8.     UPDATE account_balance SET balance=balance+tfer_amount WHERE account_id=to_account; 

9.  

10.    COMMIT; 

11.END; 





通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT,所以应该在事务中尽可能少用或注意一下:

Java代码

1. ALTER FUNCTION 

2. ALTER PROCEDURE 

3. ALTER TABLE 

4. BEGIN 

5. CREATE DATABASE 

6. CREATE FUNCTION 

7. CREATE INDEX 

8. CREATE PROCEDURE 

9. CREATE TABLE 

10.DROP DATABASE 

11.DROP FUNCTION 

12.DROP INDEX 

13.DROP PROCEDURE 

14.DROP TABLE 

15.UNLOCK TABLES 

16.LOAD MASTER DATA 

17.LOCK TABLES 

18.RENAME TABLE 

19.TRUNCATE TABLE 

20.SET AUTOCOMMIT=1 

21.START TRANSACTION 



关于savepoint当前先不做学习



事务和锁

事务的ACID属性只能通过限制数据库的同步更改来实现,通过对数据加锁来实现。
直到事务触发COMMIT或ROLLBACK语句时锁才释放。
这样做的缺点是后面的事务必须等前面的事务完成才能开始执行,吞吐量随着等待锁释放的时间增长而递减。



Mysql的innodb通过行级锁来最小化锁竞争。这样修改同一table里其他行的数据没有限制,而且读数据可以始终没有等待。



可以在SELECT语句里使用FOR UPDATE或LOCK IN SHARE MODE语句来加上行级锁

1. SELECT select_statement options [FOR UPDATE|LOCK IN SHARE MODE] 



FOR UPDATE会锁住该SELECT语句返回的行,其他SELECT和DML语句必须等待该SELECT语句所在的事务完成
LOCK IN SHARE MODE同FOR UPDATE,但是允许其他session的SELECT语句执行并允许获取SHARE MODE锁





下面了解一下死锁,悲观锁,乐观锁,但是不深入掌握,当前只掌握概念

Sql代码

   1. 死锁发生于两个事务相互等待彼此释放锁的情景 
   2. 悲观锁:在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续 
   3. 乐观所:读取数据时不锁,更新时检查是否数据已经被更新过,如果是则取消当前更新 

死锁发生于两个事务相互等待彼此释放锁的情景
悲观锁:在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续
乐观所:读取数据时不锁,更新时检查是否数据已经被更新过,如果是则取消当前更新

一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁

事务设计指南

1,保持事务短小 

2,尽量避免事务中rollback 

3,尽量避免savepoint 

4,默认情况下,依赖于悲观锁 

5,为吞吐量要求苛刻的事务考虑乐观锁 

6,显示声明打开事务 
7,锁的行越少越好,锁的时间越短越好
分享到:
评论

相关推荐

    FUNDAMENTALS OF Database Systems 第7版

    database systems and database applications. Our presentation stresses the funda- mentals of database modeling and design, the languages and models provided by the database management systems, and ...

    LabVIEW Database Connectivity Toolkit

    LabVIEW Database Connectivity Toolkit是一款专为2012版LabVIEW设计的数据连接工具,它允许用户通过图形化编程环境与各种类型的数据库进行交互,从而实现数据的读取、写入、更新和删除等操作。这款工具包极大地简化...

    SQLite Database Browser for mac os

    SQLite Database Browser 是一款专为Mac OS设计的直观易用的数据库管理工具,它专注于处理SQLite数据库文件。SQLite是一种轻量级、自包含的数据库引擎,广泛应用于移动设备、嵌入式系统以及桌面应用中,因为它不需要...

    Access2014数据库驱动 AccessDatabaseEngine.exe

    Access2014数据库驱动,即“AccessDatabaseEngine.exe”,是微软公司开发的一款重要的数据库引擎,主要用于支持32位系统下的ODBC(Open Database Connectivity)数据源。这个组件允许用户和其他应用程序通过ODBC接口...

    Six Step Relational Database Design 2nd Edition

    Six-Step Relational Database DesignTM bridges the gaps between database theory, database modeling, and database implementation by outlining a simple but reliable six-step process for accurately ...

    Oracle Database 12c (winx64_12102_database.part3.rar)

    Oracle Database 12c 适用于Windows 64位系统, winx64_12102_database文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle Database 12c (winx64_12102_database.part3.rar) ...

    Database2Sharp代码生成器 16.0 破解版

    Database2Sharp是一款主要用于C#代码以及数据库文档生成的工具,软件支持Oracle、SqlServer、MySql、Access、Sqlite等数据库的代码生成,可以生成各种架构代码、生成Winform界面代码、Web界面代码、导出数据库文档、...

    AccessDatabaseEngine 2007

    AccessDatabaseEngine 2007是微软发布的一款重要的数据库引擎,主要用于支持对Access数据库(.mdb和.accdb格式)的读写操作。这个组件在多种场景下都扮演着关键角色,比如在没有完整安装Microsoft Office的情况下,...

    Labview 2018 Database Connectivity Toolkit (32bits)

    Labview 2018 Database Connectivity Toolkit(32位)是一款专为开发人员设计的工具集,用于在Labview环境中与各种数据库系统进行交互。这款工具包提供了强大的功能,允许用户通过图形化编程方式轻松地读取、写入、...

    Oracle Database 19c (oracle-database-ee-19c.x86_64.part1.rar)

    Oracle Database 19c 是最新的长期版本,支持期限最长; 19.3 - 企业版(也包括标准版 2) 适用于Linux x86-64系统。oracle-database-ee-19c文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: ...

    Oracle Database 21c (oracle-database-ee-21c-1.0-1.ol8.part1.rar)

    Oracle Database 21c 是最新的版本; 21.3 - 企业版(也包括标准版 2) 适用于Linux x86-64位系统。oracle-database-ee-21c-1.0-1.ol8文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle ...

    Database4.zip

    数据库工具Database4,各种数据库连接方便; 数据库工具Database4,各种数据库连接方便; 数据库工具Database4,各种数据库连接方便; 数据库工具Database4,各种数据库连接方便; 数据库工具Database4,各种数据库连接...

    H2 Database(H2内存数据库)

    4、H2Database_SQL语法.doc 5、H2Database高级特性.doc 6、H2Database聚合函数.doc 7、H2Database连接配置.doc 8、H2Database数据类型.doc 9、H2Database中文教程.doc 10、H2内存数据库h2部署操作手册.docx 11、H2...

    hyperf 3.0 查询sql server数据库 database扩展修改

    hyperf 3.0 暂时没有支持查询sql server的扩展,但是hyperf/database 衍生于 laravel的illuminate/database,可以根据他来修改hyperf/database ,这个是已经修改好可以直接拿来用的把以前的vendor/hyperf 下的...

    Oracle Database 21c (oracle-database-ee-21c-1.0-1.ol8.part2.rar)

    Oracle Database 21c 是最新的版本; 21.3 - 企业版(也包括标准版 2) 适用于Linux x86-64位系统。oracle-database-ee-21c-1.0-1.ol8文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle ...

    Oracle Database 12c (winx64_12102_database.part1.rar)

    Oracle Database 12c 适用于Windows 64位系统, winx64_12102_database文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle Database 12c (winx64_12102_database.part3.rar) ...

    AccessDatabaseEngine.exe

    标题中的"AccessDatabaseEngine.exe"是指微软公司提供的一个数据库引擎,用于与Access数据库进行交互。在Windows操作系统中,这个程序通常用于处理以.MDB或.ACE为扩展名的Access数据库文件。当用户尝试连接到Access...

    Absolute_Database_v7.93_sources_for_D4-11

    《全面解析:Absolute Database v7.93 源代码在 Delphi 4 至 11 中的应用与拓展》 Absolute Database v7.93 是一款强大的、面向对象的关系型数据库管理系统,专为 Delphi 开发者设计,提供高效、稳定的数据库解决...

    Oracle Database 19c (oracle-database-ee-19c.x86_64.part3.rar)

    Oracle Database 19c 是最新的长期版本,支持期限最长; 19.3 - 企业版(也包括标准版 2) 适用于Linux x86-64系统。oracle-database-ee-19c文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: ...

    AccessDatabaseEngine64bit

    标题“AccessDatabaseEngine64bit”指的是微软的Access Database Engine 64位版本,这是一个用于与数据处理相关的组件,特别是当需要与Excel等Microsoft Office应用程序交互时。它提供了OLEDB(对象链接和嵌入数据库...

Global site tag (gtag.js) - Google Analytics