Download CF and Stored Procedures

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
CF and Stored Procedures
Lei Wang
ALP International
Main Topics
 Database Locks
 How Cold Fusion perform DB locks
 Stored Procedure
 Stress test to compare Cftransaction
and stored procedure
 How to use stored procedure
 Common Mistakes
Database Locks
 “Lost update problem”
 Multiple users accessing the same data
User1
User2
Read from database
Update record
Update record
Database Locks
 Blocking access for all other users
User1
User2
Begin Transaction
Read Value
Lock
Waiting
Update Value
Commit Transaction
Begin Transaction
Lock
Read Value
Update Value
Commit Transaction
Types of Locks
 Table-level: supported by all database.
The entire table is locked when a user
is posting a transaction that utilizes a
row from that table
 Row-level: supported by higher-end
database. Only records being utilized by
a transaction are locked.
How Cold Fusion perform DB
Locks
 Use CFTRANSACTION to group
multiple queries into a single unit.
CFTRANSACTION also provides
commit and rollback processing.

<CFTRANSACTION>
ACTION="BEGIN" or "COMMIT" or "ROLLBACK"
ISOLATION="Read_Uncommitted" or "Read_Committed" or
"Repeatable_Read"
</CFTRANSACTION>
 CFLOCK
Standard usage of
cftransaction(from CF Studio)

<CFTRY>
<CFSET commitIt = "Yes">
<CFTRANSACTION ACTION="BEGIN">
<CFQUERY NAME='makeNewCourse' DATASOURCE='cfsnippets'>
INSERT INTO Courses (Number, Descript) VALUES ('#myNumber#', '#myDescription#')
</CFQUERY>
<CFCATCH TYPE="DATABASE">
<CFTRANSACTION ACTION="ROLLBACK"/>
<CFSET commitIt = "No">
</CFCATCH>
<CFIF commitIt>
<CFTRANSACTION ACTION="COMMIT"/>
<CFQUERY >
………………………………………
</CFQUERY>
</CFTRANSACTION>
</CFTRY>
Ending tag within the cftry block should be a cfcatch tag
Standard usage of
cftransaction

<CFTRANSACTION ACTION=“BEGIN”>
<CFTRY>
<CFQUERY NAME='makeNewCourse' DATASOURCE='cfsnippets'>
INSERT INTO Courses (Number, Descript) VALUES ('#myNumber#', '#myDescription#')
</CFQUERY>
<CFQUERY >
………………………………………
</CFQUERY>
<CFTRANSACTION ACTION="COMMIT"/>
<CFCATCH TYPE="DATABASE">
<CFTRANSACTION ACTION="ROLLBACK"/>
</CFCATCH>
</CFTRY>
</CFTRANSACTION>
How DB tools perform Lock
 Transaction
A logical unit of work.
 Begin the transaction
 Commit the transaction or rollback
transaction
Standard usage of transaction
 BEGIN TRANSACTION MyTransaction
SELECT * FROM roysched
WHERE title_id LIKE ‘Pc%’
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
COMMIT TRANSACTION MyTransaction
Stored Procedure
 A stored procedure is basically a
precompiled program that is stored at
the server site.
 Stored procedure is not written in SQL
PL/SQL
Oracle
Transact-SQL
Sybase & SQL Server
Advantage of Stored
Procedure
 It enables you to write and maintain a
single set of code that is utilized by all
current and future applications that
utilize the database
 It insulates the application developers
from the structure of the database
 It can provide better performance.
Stress test
 LoadRunner is used to conduct 3 levels of




stress test, 10, 50, 100 users.
Internal network 100 M bps
Cold Fusion server 5 on Windows 2000
server (1.5 Ghz CPU, 512 MB memory)
SQL server 7 on the same Windows 2000
server
5 Pentium 430 Mhz Dell machines as client
Stress test results
 Users cftransaction Stored Procedure
1
10
50
100
0.11
1.96
8.15
15
0.11
1.47
4.57
9
What determines which tool to
use
 Less traffic, simple web page
CFTRSACTION
 Heavy traffic, complicated web pages
Stored procedure
How to write stored procedure

CREATE PROCEDURE Insert_invoice
@Amount smallmoney,@DiscAmt smallmoney,@DiscCode char(3),@PaymentTypeCode char(2),
@Token varchar(30),
@NextbContactID int ,@NextInvoiceID int output

AS
 BEGIN TRANSACTION
select
Insert
values(
@NextInvoiceID=ISNULL(max(InvoiceID)+1,10000) from T_Invoice
into T_Invoice
@NextInvoiceID,getdate(),@Amount,@DiscAmt,@DiscCode,@PaymentTypeCode,
null,getdate(),@NextbContactID,null,@Token,'N',null,null)

IF @@ERROR <>0
 ROLLBACK TRANSACTION
 ELSE
 COMMIT TRANSACTION
How to use stored procedure
 Cfstoredproc tag
<CFSTOREDPROC
PROCEDURE="procedure name"
DATASOURCE="ds_name"
USERNAME="username"
PASSWORD="password"
DBSERVER="dbms"
DBNAME="database name"
BLOCKFACTOR="blocksize"
PROVIDER="COMProvider"
PROVIDERDSN="datasource"
DEBUG="Yes/No"
RETURNCODE="Yes/No">
How to user Stored Procedure
 Cfprocparam tag
<CFPROCPARAM
TYPE="IN/OUT/INOUT"
VARIABLE="variable name"
DBVARNAME="DB variable name"
VALUE="parameter value“
CFSQLTYPE="parameter datatype“
MAXLENGTH="length"
SCALE="decimal places"
NULL="yes/no">
CFPROCPARAM
 Type:
IN/OUT/INOUT
 CFSQLTYPE 17 total
CF_SQL_INTEGER
CF_SQL_CHAR
CF_SQL_VARCHAR
CF_SQL_DATE
CF_SQL_MONEY
CFPROCPARAM
 DBVARNAME
Start with @
@NextInvoiceID
 VARIABLE
CF variable name
How to use Stored Procedure
<cfstoredproc datasource="#request.DSN#"
procedure="Insert_Invoice">
<cfprocparam type="in"
cfsqltype="CF_SQL_MONEY"
value="#attributes.Total_Due#" dbvarname="@Amount">
<cfprocparam type="in"
cfsqltype="CF_SQL_MONEY" value="#attributes.DiscAmt#"
dbvarname="@DiscAmt">
<cfprocparam type="in"
cfsqltype="CF_SQL_CHAR"
value="#attributes.assumedDiscount#" dbvarname="@DiscCode">
<cfprocparam type="in"
cfsqltype="CF_SQL_CHAR"
value="#attributes.PaymentType#" dbvarname="@PaymentTypeCode">
<cfprocparam type="in"
cfsqltype="CF_SQL_VARCHAR"
value="#str_customerToken#" dbvarname="@Token">
<cfprocparam type="in" cfsqltype="CF_SQL_INTEGER" value="1"
dbvarname="@NextContactID">
<cfprocparam type="out" cfsqltype="CF_SQL_INTEGER" variable="NextInvoiceID"
dbvarname="@NextInvoiceID">
</cfstoredproc>
Common mistakes when
using Stored Procedure
 Declaration order in stored procedure is
different from CFPROCPARAM order
Error message
Operand type clash: int is incompatible
with text
Variables are not in the same
order
@Amount smallmoney,
@DiscAmt smallmoney,
@DiscCode char(3),
@PaymentTypeCode char(2),
@Token varchar(30),
@NextContactID int,
@NextInvoiceID int output
<cfprocparam type="in"
cfsqltype="CF_SQL_MONEY"
value="#attributes.Total_Due#"
dbvarname="@Amount">
<cfprocparam ***
dbvarname="@DiscAmt">
<cfprocparam ***
dbvarname="@DiscCode">
<cfprocparam ***
dbvarname="@PaymentTypeCod
e">
<cfprocparam *** dbvarname="@Token">
<cfprocparam ***
dbvarname="@NextContactID">
<cfprocparam ***
dbvarname="@NextInvoiceID">
Common Mistakes
 Every In variable need a value
create procedure Update_Email
@StudentID int, @InvoiceID int, @Email varchar(60)
as
Begin
SELECT
FROM
WHERE
@InvoiceID=InvoiceID,@Email=StudentEmail
T_Student
StudentID=@StudentID
UPDATE
T_Invoice
SET
WHERE
END
Email=@Email
InvoiceID=@InvoiceID
Every Variable need a value

<cfprocparam type="in" cfsqltype="CF_SQL_INTEGER"
value="#attributes.StudentID#" dbvarname="@StudentID">
<cfprocparam type="in" cfsqltype="CF_SQL_INTEGER"
value="#attributes.InvoiceID#" dbvarname="@InvoiceID">
<cfprocparam type="in" cfsqltype="CF_SQL_VARCHAR"
value=“[email protected]” dbvarname="@Email">
Conflict with other DB tools
 CFTRANSACTION and TRIGGER
Triggers are specialized stored
procedures that are executed
automatically when a particular event
occurs and are used to enforce data
integrity
A lot of triggers have Rollback
transaction command
Trigger

CREATE TRIGGER Insert_T_Contacts
ON T_Contacts
FOR INSERT AS
DECLARE @JustInsertedpEmail varchar(60),
@ContactIDNew int,
@ContactIDOld int,
BEGIN
SELECT
@JustInsertedpEmail=PrimaryEmailAddress,
@ContactIDNew=ContactID
FROM
INSERTED
SELECT
@ContactIDOld=ContactID,
FROM
T_Contacts
WHERE
PrimaryEmailAddress=@JustInsertedpEmail
AND
ContactID!=@ContactIDNew
IF @@ROWCOUNT > 0
ROLLBACK TRANSACTION
End
Q&A
 [email protected]
Related documents