再看数据库——(4)事务,看数据库事务
什么是事务?简单的说,就是你要做的或所做的事情。用术语表述是指访问并可能更新数据库中各种数据项的一个程序执行单元。
在数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
举个很经典的例子:从A账户向B账户转账。这个过程需要完成两个步骤:1)从A账户中减去钱;2)在B账户中加上相应的钱数。很简单,这两个步骤缺一不可。如果一旦出错,后果不堪设想。怎么办呢?这就引出了事务的用处。
sql语句如下,当不出错时,提交事务转账成功。如果出错了,就执行回滚。数据库设计也很简单,一张money表,两个字段bankName(账户名)和totalMoney(总资产)。
begin try begin tran --开始事务 update money set totalMoney=totalMoney-100 where bankName='A' --A账户减100 update money set totalMoney=totalMoney+100 where bankName='B'--B账户加100 commit tran --提交事务 End try begin catch rollback tran --事务回滚 end catch
还以转账为例,从A向B转账。
具体代码如下:
private void button1_Click(object sender, EventArgs e)
{
SqlTransaction sqlTrans = null;
SqlConnection con = new SqlConnection("server=.;database=bank;uid=sa;pwd=123456;");
try
{
con.Open();
//开始事务
sqlTrans = con.BeginTransaction();
SqlCommand cmd = new SqlCommand("", con, sqlTrans);
cmd.CommandTimeout = 120;
cmd.CommandType = System.Data.CommandType.Text;
string cutA = "update money set totalMoney=totalMoney-@count where bankName='A'";
string addB = "update money set totalMoney=totalMoney+@count where bankName='B'";
//给参数赋值
SqlParameter paras = new SqlParameter("@count", txtMoney.Text);
cmd.Parameters.Add(paras);
cmd.CommandText = cutA;
cmd.ExecuteNonQuery();
cmd.CommandText = addB;
cmd.ExecuteNonQuery();
//throw new Exception("test exception.the transaction must rollback"); 用以测试事务回滚
//提交事务
sqlTrans.Commit();
}
catch (Exception ex)
{
//事务回滚
sqlTrans.Rollback();
Console.Write(ex.Message);
}
finally
{
if (con.State != System.Data.ConnectionState.Closed)
con.Close();
}
Console.ReadLine();
}现在看一下事务回滚时的情况:将上面注视掉的一行代码恢复正常,再次运行。减少A账户钱和增加B账户的钱,两个操作都没有执行,这样虽然即使出错了,也不会造成更严重的后果,只是让程序恢复到执行前的状态。
看了上面的例子,就能跟好的理解事务的属性了,分别有原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
1)atomicity 原子性。这说明事务是一个不可分割的工作单位,事务中包括的所有操作要么都做,要么都不做。这也是核心之处。
2)consistency 一致性。事务必须是使数据库从一个一致性状态变到另一个一致性状态。这一点和原子性很像。
3)isolation 隔离性。一个事务的执行不能被其他事务干扰。
4)durability 持久性。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。若转账成功,就将数据更新到数据库。
感想:事务,这个名词很早就听说过了。之所以到现在才去了解它实践它,是因为感觉它很难。以至于遇到类似的内容总是绕着走开,也错过了很多学习的机会。越早了解,就有越多动手实践的机会。
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求.
原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性
两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
USE pubs
在没有再次使用USE语句来改变当前数据库以前,后面的每一行操作语句都将针对pubs数据库执行。使用系统存储过程sp_helpdb可以查看当前服务器上所有数据库的信息,如果指定了数据库的名字则返回指定数据库的信息。
使用系统存储过程sp_databases可以查看当前服务器上所有可以使用的数据库。
使用系统存储过程sp_helpfile可以查看当前数据库上所有文件(包括数据文件和日志文件)的信息。如果指定了文件的名字,则返回该文件的信息。
使用系统存储过程sp_helpfilegroup可以查看当前数据库上所有文件组,包括Primary文件组和User_defined文件组的信息。如果指定了文件组的名字,则返回该文件组的信息。
可以使用企业管理器来查看更详细的有关数据库的信息,方法是:
(1) 选中要查看的数据库。
(2) 从【操作】菜单或快捷菜单中选择【属性】命令,弹出如图3.4所示的对话框。从中可以查看或者修改数据文件、日志文件、文件组及使用权限等属性。
图3.4 数据库的属性查看
3.4 管理数据库
创建好数据库,也许使用一段时间之后,发现此数据库的文件容量不敷使用、此数据库已经有一段时间不用了等相关事情发生时,就必须要针对数据库来进行管理。
3.4.1 修改数据库大小
SQL Server 2000的数据文件可以自动扩充长度,所以数据库的大小也会自动增加。但是如果设置了最大文件长度,则数据库的扩充依然是有必要进行的操作。修改数据库的大小实质上是修改数据文件和日志文件的长度,或者增加/删除操作系统文件。这种操作可以通过下面的语法来实现:
ALTER DATABASE database
{ ADD FILE <filespec> [,...n] [TO FILEGROUP filegroup_name]
| ADD LOG FILE <filespec> [,...n]
| REMOVE FILE logical_file_name
| ADD FILEGROUP filegroup_name
| REMOVE FILEGROUP filegroup_name
| MODIFY FILE <filespec>
| MODIFY FILEGROUP filegroup_name filegroup_property
}
<filespec> ::=
(NAME = logical_file_name
[, FILENAME = 'os_file_name' ]
[, SIZE = size]
[, MAXSIZE = { max_size | UNLIMITED } ]
[, FILEGROWTH = growth_increment] )
下面的例子在Company数据库的默认文件组Primary文件组里,增加了一个数据文件。
ALTER DATABASE Company
ADD FILE
(
NAME = Test1dat2,
FILENAME = 'e:\program files\Microsoft sql server\mssql\data\t1dat2.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)......余下全文>>